Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Уточняю - на сколько я протормозил ;))) 26.04.04 22:04 Число просмотров: 940
Автор: void <Grebnev Valery> Статус: 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(.....)
Теперь я рад, что хоть и в надуманном примере, но процесс управляемый ;))))
Теперь дополнительные вопросы:
1) Почему в stdafx.h проекта требуется одновременные декларации
#define UNICODE
#define _UNICODE
Только одного из символов недостаточно. Появляются ошибки компиллера. Проект - чисто winapi.
2) Почему #pragma setlocale ни как не отражается на строках в ресурсах. Там важно другое - в какой секции расположены строковые ресурсы или строки элементов управления.
|
|
|