Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
так как у тебя #define _unicode, то _т("привет") уже unicode... 27.04.04 00:00 Число просмотров: 1021
Автор: + <Mikhail> Статус: Elderman
|
> > DrawText (hdc, _T("Привет") , -1, > > Я так понимаю вопросы здесь? > > _T() это макрос из tchar.c, который в зависимости от > > наличия макроса _UNICODE (именно с подчеркиванием) > делает > > или L"Привет" или просто "Привет". > > Это понятно. Было не понятно, как копилер в зависимости от > региональных настроек ОС компилит строку? Что он при этом > делает? Как определяет кодовую страничку для > преобразования? См. ниже. > > > > Кто выполняет эти преобразования? > > Компилятор. Стандарт языка C++ предусматривает два > вида > > строковых литералов: "string" - обычная ASCII-строка и > > L"string" - Unicode-строка (аналогично 'c' и L'c') > > Как ты считаешь, что находится в строках с-кода (т.е. в > тексте), когда мы редактируем файл в > IDE MS VS? Я просто не проверял. > А если я, к примеру, японец, и пишу японскую программу на > японском компьютере (пользуясь IDE MS VS), где в тексте > программы создаю японское привет _T(" здесь пишу > иероглифами ")? Ты думаешь, что там будет строка с > однобайтными символами? > > > > Что происходит с памятью, выделенной для строки? > > Ничего она просто попадает в data-секцию в готовом к > > употреблению виду. > > Я имел ввиду не то, где она будет расположена, а то, > насколько корректно компиллер сможет определить требуемое > число байт, если он корректно распознаёт символы UNICODE на > стадии компиляции. > В частности, меня смутили заявления MS, что желательно > строки в ресурсах делать длиннее требуемых на 30 % > (наверное, заполнять пробелами ?). Я не понимаю, зачем это > необходимо делать. > И надо ли на самом деле? > > > Если я неправильно понял суть вопроса - скажи > > Суть вопроса была в том, что я не понимал, откуда компилер > берёт информацию для преобразования строки _T("Привет") в > соответствии с русской кодировкой? При этом предполагалось, > что мы не используем преобразование в явном виде при помощи > MultiByteToWideChar, а компилер должен сам догадаться > каким-то образом, что русские символы следует конверировать > в русскую кодировку UNICODE. > По тому, что нормальность, или не нормальность > перекодировки зависит от региональных настроек ОС - можно > было догадаться, что если компилеру не указывать ничего о > кодировке, то будет использованы установки по-умолчанию ОС. > Меня смущала эта неопределённость, в некотором смысле. > > Парни с одного из российских форумов только-только мне > подсказали, мол для очистки совести попробуй > #pragma setlocale(.....) ;))) > > Я попробовал и понял, какой я идиот. ;))) Нет, чтоб > покопать самому в директивах компиллера ;))) Теперь мне > стыдно ;))) > Это меня удовлетворило. Теперь понятно, что > неопределённости нет. Либо компиллер будет использовать > настройки ОС ( если ему ничего не подсказывать про > кодировку, например, русскую ), либо можно явно указывать, > что на стадии компиляции все строки должны быть > преобразованы в UNICODE стоки с русскими символами, если мы > используем #pragma setlocale(.....) > Теперь я рад, что хоть и в надуманном примере, но процесс > управляемый ;))))
так как у тебя #define _UNICODE, то _Т("Привет") уже UNICODE и ни о каких преобразованиях и речи быть не должно.
другое дело если у тебя _MBCS или SBCS
> > Теперь дополнительные вопросы: > > 1) Почему в stdafx.h проекта требуется одновременные > декларации > #define UNICODE > #define _UNICODE
UNICODE - используются в "windows headers"
_UNICODE - используются в "C-runtime/MFC headers"
> > Только одного из символов недостаточно. Появляются ошибки должно быть достаточно одного какого-либо define, другой define автоматически
> компиллера. Проект - чисто winapi. > > 2) Почему #pragma setlocale ни как не отражается на строках > в ресурсах. Там важно другое - в какой секции расположены
наверно надо #pragma setlocale в ресурсе тоже(это для _MBCS или SBCS?). вообще ни когда не имел проблем если исползовать UNICODE, windows то UNICODE-ная.
> строковые ресурсы или строки элементов управления.
|
|
|