Re[6]: Объясните новичку про UNICODE
От: Аноним  
Дата: 24.10.05 09:23
Оценка:
День добрый.

1.

в коде кроме как char * ты ничего больше не заведешь. Потому что сырец — он ansi


Ну почему же . 'сырец' это, конечно, ANSI, но UNICODE в нем прописать достаточно легко:

wchar_t *swzText = L"test, тест";
::MessageBoxW(0, swzText, L"Caption", MB_OK);


UNICODE-строки имеют тип wchar_t * (или любой указатель на массив с двубайтовой дискретизацией). Если мы хотим задать строку в коде — то надо перед тектом добавить литеру L. Следует отметить, что это гарантировано работает только для английского. Для любого другого языка — уже зависит от версии компилятора.


2.

Ресурсы, как бы страшно это ни звучало, лежат в UNICODE . Всегда. Везде. Даже на Win95. Другое дело, что под Win9x пользовательские Win API функции их автоматически преобразовывают в ANSI ( LoadStringA и иже с ними).

3.

Функции, работающие с текстом, имеют как 'A', так и 'W' версию. Например: TextOutA(), TextOutW(). несмотря на то, что почти 'A' и 'W' версии доступны на всех операционках, под Win9x большинство 'W' функций представляют собой 'пустышки', тоесть при их вызое максимум что произойдет — функция вернет состояние ошибки. Есть приятные исключения — та же TextOutW работает начиная с Win9x .

4.

Текст на экран выводится в зависимости от наличия шрифтов. Если на WinXP SP2 не инсталлированы японские иероглифы, то TextOutW() разродится знаками вопросов и квадратиками. Опять же, если Win95 героически имеет японский мултибайт, то TextOutW() на ней все нормально отрисует.

*кстати, Win9x японская, китайская итд. не имеют полноценного unicode. У них вместо него полный multibyte — тоесть строка та же ANSI, но одному символу может соответствовать более одного байта.

5.

WideCharToMultiByte() используется, если unicode-программа должна работать под Win9x. При любом выводе на экан (CreateWindowA(), MessageBoxA() итд.) используется WideCharToMultiByte для преобразования unicode в ANSI, а затем вызывается 'A' функция. Под WinNT же ничего не преобразовывается и вызывается 'W' функция.

MultiByteToWideChar() используется, чтобы ANSI ввод от пользователя под Win9x (содержимое edit и прочих control'ов) преобразовать в UNICODE для внутренней работы (если программа unicode, то во избежании путаницы внутри себя она работает только с unicode и поэтому весь ввод от пользователя под Win9x надо в unicode преобразовывать).

6.

'Как делать' — это сугубо вопрос вкуса. Я, например, в своих программах все строки храню в ресурсах как unicode, обрабатываю как unicode, а при выводе на экран если я под Win9x — использую WideCharToMultiByte() чтобы преобразовать в multibyte,
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.