Re[3]: Объясните новичку про UNICODE
От: aik Австралия  
Дата: 24.10.05 07:16
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Спасибо большое. Но каша, бывшая до этого в голове, не исчезла, а только немного размазалась по стенкам черепа.


M>Итак:

aik>>Таблиц ANSI — до черта, на каждый язык — по таблице. unicode — только одна. Это тот вариант юникода, в котором 2 байта на символ (бывают и другие, в виндах их нет), его и называют в винде просто UNICODE. Глядеть — открывай character map и смотри.
А>>>2) Есть строка кодов. Однозначно ли по ней определяется строка символов? Если нет, то как это обходят?
aik>>Для юникода — да. Для ANSI — надо знать локаль строки (ну там системная, или локаль треда). Для этого в MultiByteStringToWideCharString и есть нужные дополнительные параметры, которые, кстати, в RC скриптах и лежат в том числе рядом со строковыми ресурсами.

M>С этим понтяно. Далее очень бы хотелось рассуждать именно в терминах этих таблиц.

M>Как мне завести уникодную строку в коде? это уже видимо будет не char*? А как? И как в эту строку засунуть фразу "ПриветМир"?

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

А>>>5) Есть две функции WideCharStringToMultiByteString и MultiByteStringToWideCharString. Что они из себя представляют? Как работаюют внутри?

aik>>Буквы из массива в массив перекладывают.
M>Имелось ввиду как они сопоставлют символ символлу (в терминах таблиц символов)

Юникодный символ — абсюлютен. Ну, где то в винде есть таблицы (ANSI + локаль) -> unicode, никогда меня это сильно не интересовало. Подозреваю, что это все лежит в файлах C:\WINDOWS\system32\*.nls. Т. е. под свою локаль — своя таблица. Таблица выбирается параметром в MultiByteStringToWideCharString.

А>>>6) Как происходит процесс отображения строки на экран в различных ОС?

aik>>Из фонтов выковыривают. В фонтах покруче на все буквы есть начертания, полажовее — только на некоторые (скажем, латинские + кириллица).

M>Так, а тут стоп. У нас есть только строка кодов символов. Чтобы отобразить её нужно сказать каким шрифтом — это ясно. Условно скажем — внутри системы етсь функция WriteString(строка, шрифт).

M>Что происходит? Как ОС расчухивает что за строка и как она сопосталяет её со шрифтом? Какую тут играет роль поле CharSet структуры LOGFONT? Ведь именно тут мы из "Привет" получаем "??????"

В шрифте заданы отображения для символом с кодами. Фонты — они сразу юникодные, по крайней мере, TrueType. Считай, что массив такой, индекс в массиве — это 2-байтовый код символа.
Если ты выводишь ANSI: система видит байт, знает локаль, получает из байта юникодный символ, видит фонт и выковыривает из фонта по юникодному символу его отображение и рисует.

А>>>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")??

aik>>На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode.
M>Опять непонятно. Можно чуть-чуть псевдокода?

Что именно непонятно то? Как строку в ресурс положить?

M>Вот есть у нас такая штука

M>Const char* str = "HelloWorld";
M>Вообще эта строка в чем? В UNICODE?

ANSI. Если напишешь так:
const wchar_t* str = L"HelloWorld";
то она будет юникодной, но использовать в ней можно будет только те символы текущей локали, которые WideCharStringToMultiByteString сумеет смаппить на однобайтовые (т.е. русские — легко, китайские — шиш).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.