Очень хочу разобраться со всеми UNICODE-ными прибамбасами. Облазил весь инет и перерыл все книжки дома. В результате в голове сложилось что-то сумбурное. Поэтому имеются три кучки вопросов.
Единственное, в чем я уверен на 100 процентов: любой символ в компьютере кодируется числом. Есть алфавиты, все символы которых помещаются в один байт, а например китайские — не помещаются — из-за них собственно и было все это придумано.
Далее все в тумане.
Итак. Первая кучка вопросов касается терминологии.
1) Везде написано "стандарт ANSI" , "стандарт UNICODE" — и не расшифровывается что это такое. А что это такое? Это какие-то таблицы соответствия символа и кода? А сколько таких таблиц в этих двух стандартах и где на них можно глянуть?
2) Есть строка кодов. Однозначно ли по ней определяется строка символов? Если нет, то как это обходят?
Вторая кучка вопросов качается различных Windows и отображения строк в них
3) Итак. В Windows95-95 нету UNICODE. Но скорее всего китайские версии этих ОС существуют. Как же этого добились?
4) Как работаю программы скомпилированные с UNICODE под WINDOWS95-98
5) Есть две функции WideCharStringToMultiByteString и MultiByteStringToWideCharString. Что они из себя представляют? Как работаюют внутри?
6) Как происходит процесс отображения строки на экран в различных ОС?
7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")??
8) Если я написал MessageBoxA("Привет"), то при каких условиях эта строка будет нормально отображаться? Что нужно сделать и возможно ли вообще это чтобы это "Привет" выглядело ВСЕГДА и ВЕЗДЕ и на всех версиях WINDOWS одинаково (то есть не как "??????").
Третья кучка вопросов касается ресурсов программы и в частности строковых ресурсов
9) Что значит в указании проекта, что ресурсы например Русские? Как это на что влияет? Это я так понимаю не дает гарантии, что все будет нормально?
10) Как узнать у ОС, Что она может нормально отобразить ту или иную сстроку?
Ну самое главное что я хочу понять — как использовать этот самый UNICODE, чтобы моя "привет" на всех машинах была именно "привет"-ом, а не "??????"-ом
Здравствуйте, Аноним, Вы писали:
А>Очень хочу разобраться со всеми 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, чтобы моя "привет" на всех машинах была именно "привет"-ом, а не "??????"-ом
См. выше.
На оставшиеся вопросы отвечу только когда зарегистришься
Спасибо большое. Но каша, бывшая до этого в голове, не исчезла, а только немного размазалась по стенкам черепа.
Итак: 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?
Что нужно сделать чтобы Везде она отображалась как нужно?
Здравствуйте, 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 сумеет смаппить на однобайтовые (т.е. русские — легко, китайские — шиш).
Здравствуйте, Аноним, Вы писали:
А>Очень хочу разобраться со всеми UNICODE-ными прибамбасами. Облазил весь инет и перерыл все книжки дома. В результате в голове сложилось что-то сумбурное. Поэтому имеются три кучки вопросов. А>Единственное, в чем я уверен на 100 процентов: любой символ в компьютере кодируется числом. Есть алфавиты, все символы которых помещаются в один байт, а например китайские — не помещаются — из-за них собственно и было все это придумано. А>Далее все в тумане.
Здравствуйте, aik, Вы писали:
aik>Здравствуйте, Аноним, Вы писали:
А>>Очень хочу разобраться со всеми UNICODE-ными прибамбасами. Облазил весь инет и перерыл все книжки дома. В результате в голове сложилось что-то сумбурное. Поэтому имеются три кучки вопросов. А>>Единственное, в чем я уверен на 100 процентов: любой символ в компьютере кодируется числом. Есть алфавиты, все символы которых помещаются в один байт, а например китайские — не помещаются — из-за них собственно и было все это придумано. А>>Далее все в тумане.
А>>Итак. Первая кучка вопросов касается терминологии.
А>>1) Везде написано "стандарт ANSI" , "стандарт UNICODE" — и не расшифровывается что это такое. А что это такое? Это какие-то таблицы соответствия символа и кода? А сколько таких таблиц в этих двух стандартах и где на них можно глянуть?
aik>Таблиц ANSI — до черта, на каждый язык — по таблице. unicode — только одна. Это тот вариант юникода, в котором 2 байта на символ (бывают и другие, в виндах их нет), его и называют в винде просто UNICODE. Глядеть — открывай character map и смотри.
А>>2) Есть строка кодов. Однозначно ли по ней определяется строка символов? Если нет, то как это обходят?
aik>Для юникода — да. Для ANSI — надо знать локаль строки (ну там системная, или локаль треда). Для этого в MultiByteStringToWideCharString и есть нужные дополнительные параметры, которые, кстати, в RC скриптах и лежат в том числе рядом со строковыми ресурсами.
А>>Вторая кучка вопросов качается различных Windows и отображения строк в них
А>>3) Итак. В Windows95-95 нету UNICODE. Но скорее всего китайские версии этих ОС существуют. Как же этого добились?
aik>utf8 (или utf7? не помню). Unicode, совместимый с одно-байтовыми строками в том смысле, что заканчивается однобайтовым нулем.
Так то есть специальные библиотеки юникодные для Win9x (читайте здесь
А>>4) Как работаю программы скомпилированные с UNICODE под WINDOWS95-98
aik>Никак. WinAPI юникод не держит, хотя соответствующие экспорты обычно есть. Есть обход в виде Microsoft layer for unicode для win9x.
Вообще, наверное стоит почитать книжку Рихтера про программирвоание в винде
А>>5) Есть две функции WideCharStringToMultiByteString и MultiByteStringToWideCharString. Что они из себя представляют? Как работаюют внутри?
aik>Буквы из массива в массив перекладывают.
Читать в MSDN, вряд ли кто то тут перевод будет делать...
А>>6) Как происходит процесс отображения строки на экран в различных ОС?
aik>Из фонтов выковыривают. В фонтах покруче на все буквы есть начертания, полажовее — только на некоторые (скажем, латинские + кириллица).
А>>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")??
aik>На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode.
Есть забавный макрос _TEXT("блабла")
Подробнее читать у Рихтера
А>>8) Если я написал MessageBoxA("Привет"), то при каких условиях эта строка будет нормально отображаться? Что нужно сделать и возможно ли вообще это чтобы это "Привет" выглядело ВСЕГДА и ВЕЗДЕ и на всех версиях WINDOWS одинаково (то есть не как "??????").
aik>См. выше. Делаешь ресурс с русским языком и строку — туда. И надеяться что на целевой машине будет русский фонт, без него все равно щастья не выйдет, хотя, скажем, файловое API работать уже будет.
А>>Третья кучка вопросов касается ресурсов программы и в частности строковых ресурсов
А>>9) Что значит в указании проекта, что ресурсы например Русские? Как это на что влияет? Это я так понимаю не дает гарантии, что все будет нормально?
aik>Определиться в препроцессоре _UNICODE и всякие CreateFile* станут CreateFileW вместо CreateFileA, TCHAR тоже будет не char, а wchar_t. Это — все, линкер уже не знает ни о каких юникодах.
Это для локализации приложения нужно, при определенных условиях загрузка будет либо русской либо американской либо фашисткой и т.д. Понято, что если запустить на китайской винде русское приложение результат будет прикольным
А>>10) Как узнать у ОС, Что она может нормально отобразить ту или иную сстроку?
aik>Никак. Юникод в каком то виде (unicode/utf8/utf7) есть в любой винде, фонтов может не быть, пропарсить фонт, наверное, можно, или можно попробовать нарисовать функцией TextOut (или какая там рисует и говорит сколько удалось нарисовать) в контекст памяти, посмотреть что вышло.
Можно узнать поддерживает ли винда нужную локализацию и делать выводы от этого...
А>>Ну самое главное что я хочу понять — как использовать этот самый UNICODE, чтобы моя "привет" на всех машинах была именно "привет"-ом, а не "??????"-ом
Локализацию проверять и все лишь...
aik>См. выше. aik>На оставшиеся вопросы отвечу только когда зарегистришься
Здравствуйте, aik, Вы писали:
aik>В шрифте заданы отображения для символом с кодами. Фонты — они сразу юникодные, по крайней мере, TrueType. Считай, что массив такой, индекс в массиве — это 2-байтовый код символа. aik>Если ты выводишь ANSI: система видит байт, знает локаль, получает из байта юникодный символ, видит фонт и выковыривает из фонта по юникодному символу его отображение и рисует.
А>>>>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")?? aik>>>На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode. M>>Опять непонятно. Можно чуть-чуть псевдокода?
aik>Что именно непонятно то? Как строку в ресурс положить?
Так ведь неизвестно где будет программа запускаться. Все случаи на каждую сточку чтьоли разбирать?
И что значит "На латинице — будет, всегда. На китайском..." Я спрашивал именно про "HelloWorld". Она на английском. А что имеется ввиду "На китайском...."?
Здравствуйте, Misha87, Вы писали:
aik>>В шрифте заданы отображения для символом с кодами. Фонты — они сразу юникодные, по крайней мере, TrueType. Считай, что массив такой, индекс в массиве — это 2-байтовый код символа. aik>>Если ты выводишь ANSI: система видит байт, знает локаль, получает из байта юникодный символ, видит фонт и выковыривает из фонта по юникодному символу его отображение и рисует. А>>>>>7) Например, я написал в программе MessageBoxA("HelloWorld"). Эта Строка будет нормально отображаться под любыми виндами с любым языком? У китайцев будет? А если написал MessageBoxW("HelloWorld")?? aik>>>>На латинице — будет, всегда. На китайском — тебе придется руками заделать константную строку в uft8, затем (если win9x) вызвать MessageBoxA, либо (в winnt) MultiByteStringToWideCharString(uft8->unicode) MessageBoxW. Или поместить строку в ресурс, там все строки в юникоде, только страну не перепутай, потому что RC скрипт — все равно ANSI и его надо корректно конвертить в unicode. M>>>Опять непонятно. Можно чуть-чуть псевдокода? aik>>Что именно непонятно то? Как строку в ресурс положить? M>Так ведь неизвестно где будет программа запускаться. Все случаи на каждую сточку чтьоли разбирать?
Строчки (все, которые видит юзер и многие из невидимых) надо запихивать в ресурсы. Даже самые лажовые. Кому надо — переведут на крайний случай.
M>И что значит "На латинице — будет, всегда. На китайском..." Я спрашивал именно про "HelloWorld". Она на английском. А что имеется ввиду "На китайском...."?
HelloWorld — будет всегда написана корректно, я уже об этом явно написал. ANSI строка с кодами > 127 — далеко не всегда.
Re[6]: Объясните новичку про UNICODE
От:
Аноним
Дата:
24.10.05 09:23
Оценка:
День добрый.
1.
в коде кроме как char * ты ничего больше не заведешь. Потому что сырец — он ansi
Ну почему же . 'сырец' это, конечно, ANSI, но UNICODE в нем прописать достаточно легко:
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,
Re[7]: этот ход - процитировать мои же письма мне - я не пон
Цитировал я всего один ответ где было сказано, что в ansi сорце нельзя задать unicode. Показал, как можно. Дабы новички не мучились. Вас так обижает, что Ваши ответы цитируют? Напоминаю, что если Вы пишете на этот форум, то наверняка читали его правила, в которых момент с цитированием оговорен.
А>Ну почему же . 'сырец' это, конечно, ANSI,
А>UNICODE-строки имеют тип wchar_t * (или любой указатель на массив с двубайтовой дискретизацией). Если мы хотим задать строку в коде — то надо перед тектом добавить литеру L. Следует отметить, что это гарантировано работает только для английского. Для любого другого языка — уже зависит от версии компилятора.
Слово "конечно" здесь совершенно неуместно. Сырец — это не обязательно ANSI. Мало кто знает, но в VC7.1 исходники можно сохранять и в юникоде, редактор легко разбирается как с юникодом, так и с ANSI. Благодаря этому в исходнике можно использовать любые языки:
Единственное ограничение заключается в том, что #include'd файлы должны быть в той же кодировке.
Re[8]: Объясните новичку про UNICODE
От:
Аноним
Дата:
25.10.05 09:44
Оценка:
День добрый.
Слово "конечно" здесь совершенно неуместно. Сырец — это не обязательно ANSI. Мало кто знает, но в VC7.1 исходники можно сохранять и в юникоде, редактор легко разбирается как с юникодом, так и с ANSI. Благодаря этому в исходнике можно использовать любые языки.
Спасибо, не знал . Тоже сначала хотел написать что исходные коды это просто текст а ANSI — ограничение компилятора, но засомневался в наличие компиляторов, нормально работающих с UNICODE . Сам до сих пор на VC 6.0 сижу — привык .
aik>Строчки (все, которые видит юзер и многие из невидимых) надо запихивать в ресурсы. Даже самые лажовые. Кому надо — переведут на крайний случай.
В ресурсы надо запихивать только те строки, которые при локализации потребуют перевода. Строки вида "%5.2f" запихивать в ресурсы глупо. (А то еще переведут... )