Здравствуйте, Аноним, Вы писали:
А>Очень хочу разобраться со всеми UNICODE-ными прибамбасами. Облазил весь инет и перерыл все книжки дома. В результате в голове сложилось что-то сумбурное. Поэтому имеются три кучки вопросов.
А>Единственное, в чем я уверен на 100 процентов: любой символ в компьютере кодируется числом. Есть алфавиты, все символы которых помещаются в один байт, а например китайские — не помещаются — из-за них собственно и было все это придумано.
А>Далее все в тумане.
А>Итак. Первая кучка вопросов касается терминологии.
А>1) Везде написано "стандарт ANSI" , "стандарт UNICODE" — и не расшифровывается что это такое. А что это такое? Это какие-то таблицы соответствия символа и кода? А сколько таких таблиц в этих двух стандартах и где на них можно глянуть?
Таблиц ANSI — до черта, на каждый язык — по таблице. unicode — только одна. Это тот вариант юникода, в котором 2 байта на символ (бывают и другие, в виндах их нет), его и называют в винде просто UNICODE. Глядеть — открывай character map и смотри.
А>2) Есть строка кодов. Однозначно ли по ней определяется строка символов? Если нет, то как это обходят?
Для юникода — да. Для ANSI — надо знать локаль строки (ну там системная, или локаль треда). Для этого в MultiByteStringToWideCharString и есть нужные дополнительные параметры, которые, кстати, в RC скриптах и лежат в том числе рядом со строковыми ресурсами.
А>Вторая кучка вопросов качается различных Windows и отображения строк в них
А>3) Итак. В Windows95-95 нету UNICODE. Но скорее всего китайские версии этих ОС существуют. Как же этого добились?
utf8 (или utf7? не помню). Unicode, совместимый с одно-байтовыми строками в том смысле, что заканчивается однобайтовым нулем.
А>4) Как работаю программы скомпилированные с UNICODE под WINDOWS95-98
Никак. WinAPI юникод не держит, хотя соответствующие экспорты обычно есть. Есть обход в виде Microsoft layer for unicode для win9x.
А>5) Есть две функции WideCharStringToMultiByteString и MultiByteStringToWideCharString. Что они из себя представляют? Как работаюют внутри?
Буквы из массива в массив перекладывают.
А>6) Как происходит процесс отображения строки на экран в различных ОС?
Из фонтов выковыривают. В фонтах покруче на все буквы есть начертания, полажовее — только на некоторые (скажем, латинские + кириллица).
А>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")??
На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode.
А>8) Если я написал MessageBoxA("Привет"), то при каких условиях эта строка будет нормально отображаться? Что нужно сделать и возможно ли вообще это чтобы это "Привет" выглядело ВСЕГДА и ВЕЗДЕ и на всех версиях WINDOWS одинаково (то есть не как "??????").
См. выше. Делаешь ресурс с русским языком и строку — туда. И надеяться что на целевой машине будет русский фонт, без него все равно щастья не выйдет, хотя, скажем, файловое API работать уже будет.
А>Третья кучка вопросов касается ресурсов программы и в частности строковых ресурсов
А>9) Что значит в указании проекта, что ресурсы например Русские? Как это на что влияет? Это я так понимаю не дает гарантии, что все будет нормально?
Определиться в препроцессоре _UNICODE и всякие CreateFile* станут CreateFileW вместо CreateFileA, TCHAR тоже будет не char, а wchar_t. Это — все, линкер уже не знает ни о каких юникодах.
А>10) Как узнать у ОС, Что она может нормально отобразить ту или иную сстроку?
Никак. Юникод в каком то виде (unicode/utf8/utf7) есть в любой винде, фонтов может не быть, пропарсить фонт, наверное, можно, или можно попробовать нарисовать функцией TextOut (или какая там рисует и говорит сколько удалось нарисовать) в контекст памяти, посмотреть что вышло.
А>Ну самое главное что я хочу понять — как использовать этот самый UNICODE, чтобы моя "привет" на всех машинах была именно "привет"-ом, а не "??????"-ом
См. выше.
На оставшиеся вопросы отвечу только когда зарегистришься