Здравствуйте, aik, Вы писали:
Спасибо большое. Но каша, бывшая до этого в голове, не исчезла, а только немного размазалась по стенкам черепа.
Итак:
aik>Таблиц ANSI — до черта, на каждый язык — по таблице. unicode — только одна. Это тот вариант юникода, в котором 2 байта на символ (бывают и другие, в виндах их нет), его и называют в винде просто UNICODE. Глядеть — открывай character map и смотри.
А>>2) Есть строка кодов. Однозначно ли по ней определяется строка символов? Если нет, то как это обходят?
aik>Для юникода — да. Для ANSI — надо знать локаль строки (ну там системная, или локаль треда). Для этого в MultiByteStringToWideCharString и есть нужные дополнительные параметры, которые, кстати, в RC скриптах и лежат в том числе рядом со строковыми ресурсами.
С этим понтяно. Далее очень бы хотелось рассуждать именно в терминах этих таблиц.
Как мне завести уникодную строку в коде? это уже видимо будет не char*? А как? И как в эту строку засунуть фразу "ПриветМир"?
А>>5) Есть две функции WideCharStringToMultiByteString и MultiByteStringToWideCharString. Что они из себя представляют? Как работаюют внутри?
aik>Буквы из массива в массив перекладывают.
Имелось ввиду как они сопоставлют символ символлу (в терминах таблиц символов)
А>>6) Как происходит процесс отображения строки на экран в различных ОС?
aik>Из фонтов выковыривают. В фонтах покруче на все буквы есть начертания, полажовее — только на некоторые (скажем, латинские + кириллица).
Так, а тут стоп. У нас есть только строка кодов символов. Чтобы отобразить её нужно сказать каким шрифтом — это ясно. Условно скажем — внутри системы етсь функция WriteString(строка, шрифт).
Что происходит? Как ОС расчухивает что за строка и как она сопосталяет её со шрифтом? Какую тут играет роль поле CharSet структуры LOGFONT? Ведь именно тут мы из "Привет" получаем "??????"
А>>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")??
aik>На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode.
Опять непонятно. Можно чуть-чуть псевдокода?
Вот есть у нас такая штука
Const char* str = "HelloWorld";
Вообще эта строка в чем? В UNICODE?
Что нужно сделать чтобы Везде она отображалась как нужно?
Остальное — дальше