Здравствуйте, 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 сумеет смаппить на однобайтовые (т.е. русские — легко, китайские — шиш).