MSI Lab - Форум по русификации
Основные форумы => Общий форум => Тема начата: Балаганов от 12 Апреля 2006, 14:21:17
-
Всем привет!
Столкнулся с такой проблемой - часть ресурсов в проге видна только в хекс-редакторе, в юникоде. Но при переводе получается что-то непонятное, не так, как при неверной кодировке. Например, слово "Шаг" отображается в таком виде "Оаа". В реестре кодовые страницы исправлены (1250, 1252, 1253 на 1251). Впервые с таким сталкиваюсь.
-
Балаганов
Если в Юникоде, то и переводить надо в Юникод. Например, слово "Шаг" в Юникоде должно быть закодировано такими значениями:
28 04 30 04 33 04 (03
Если же тупо подставить русские символы рядом с ноликами:
D8 00 E0 00 E3 00 Шаг
то в Юникоде это вовсе не будет соответствовать русскому слову Шаг, а будет кодировать последовательность символов Øàã, которая при переводе в русскую локаль как раз и превратится в Oaa.
-
А поподробнее можно. Я впервые с юникодом сталкиваюсь. Обычно, в хексе попадается ASCII.
-
Балаганов
Юникод - универсальная кодировка. В ANSI на каждый символ приходится 8 бит, получается 256 возможных символов. Для многоязычного приложения этого недостаточно, поэтому придумали разные формы Юникода, где символы могут занимать большее число бит. В UTF-16, под которой обычно и понимают Юникод-кодировку, на каждый символ выделено 16 бит, что даёт возможность закодировать уже 65536 символов. Этого вполне достаточно.
Соответственно, каждый символ занимает два байта. Для базовых символов - латинского алфавита, цифр, знаков пунктуации и т.п. - используются первые 128 символов из этих 65536. Например, латинская "A" имеет код 65. В шестнадцатеричном предствлении это 0041. Байты хранятся обычно в перевёрнутом виде, поэтому в файле записано: 41 00, что в текстовом представлении будет выглядеть как символ A, за которым следует непечатный символ с кодом 0 (обычно вместо него редакторы отображают либо пробел, либо точку). То есть слово, написанное латинскими буквами, выглядит как самое обычное слово, только после каждой буквы написан этот самый нулевой символ. Например:
41 00 42 00 42 00 41 00 A.B.B.A.
Возникает соблазн заменить латинские буквы русскими, а нолики оставить. Однако при этом произойдёт вовсе не то, что ожидается, и вот почему. Например, пишем русскую П вместо такого латинского символа. В русской кодовой странице (в ANSI) эта буква имеет код CF (207). В результате в файле будет записано CF 00, и получается шестнадцатеричное число 00CF (равное, естественно, тому же 207). Но кто сказал, что в Юникоде это самое 207 соответствует букве П? Это совершенно другой символ - Ï. А русская П в юникодной кодировке имеет номер 041F (1055), т.е. будучи записанным в файле это число будет выглядеть как 1F 04. А значит, именно эту последовательность байт нужно вписывать, а вовсе не русскую "П" с последующим ноликом.
Юникодные строки надо переводить юникодными строками, по всем правилам. А именно (как вариант): создать текстовый файл в юникоде (любым редактором, поддерживающим эту кодировку), вписать туда нужные строки, открыть шестнадцатеричным редактором и нужные коды перенести из этого текста в программу.
-
CaptainFlint, Спасибо за подробное объяснение!
Сразу возникает следующий вопрос по поводу:
создать текстовый файл в юникоде (любым редактором, поддерживающим эту кодировку)
Блокнот в качестве этого редактора подойдет, в нем, вроде, поддержка юникода есть?
-
Балаганов
Блокнот в качестве этого редактора подойдет, в нем, вроде, поддержка юникода есть?
Да, если речь идёт о Win2000/XP.
-
CaptainFlint, спасибо . Буду мучить прогу дальше.