Автор Тема: Кодировка?  (Прочитано 22616 раз)

Оффлайн Балаганов

  • Новичок
  • *
  • Сообщений: 36
    • http://ez7pac.narod.ru/
Кодировка?
« : 12 Апреля 2006, 14:21:17 »
Всем привет!
Столкнулся с такой проблемой - часть ресурсов в проге видна только в хекс-редакторе, в юникоде. Но при переводе получается что-то непонятное, не так, как при неверной кодировке. Например, слово "Шаг" отображается в таком виде "Оаа". В реестре кодовые страницы исправлены (1250, 1252, 1253 на 1251). Впервые с таким сталкиваюсь.

Оффлайн CaptainFlint

  • Старожил
  • ****
  • Сообщений: 297
    • http://flint-inc.ru/
Кодировка?
« Ответ #1 : 12 Апреля 2006, 16:23:22 »
Балаганов
Если в Юникоде, то и переводить надо в Юникод. Например, слово "Шаг" в Юникоде должно быть закодировано такими значениями:
28 04 30 04 33 04        (03
Если же тупо подставить русские символы рядом с ноликами:
D8 00 E0 00 E3 00        Шаг
то в Юникоде это вовсе не будет соответствовать русскому слову Шаг, а будет кодировать последовательность символов Øàã, которая при переводе в русскую локаль как раз и превратится в Oaa.
Почему же, ё-моё, ты нигде не пишешь "ё"?

Оффлайн Балаганов

  • Новичок
  • *
  • Сообщений: 36
    • http://ez7pac.narod.ru/
Кодировка?
« Ответ #2 : 12 Апреля 2006, 19:39:44 »
А поподробнее можно. Я впервые с юникодом сталкиваюсь. Обычно, в хексе попадается ASCII.

Оффлайн CaptainFlint

  • Старожил
  • ****
  • Сообщений: 297
    • http://flint-inc.ru/
Кодировка?
« Ответ #3 : 12 Апреля 2006, 20:07:33 »
Балаганов
Юникод - универсальная кодировка. В 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. А значит, именно эту последовательность байт нужно вписывать, а вовсе не русскую "П" с последующим ноликом.

Юникодные строки надо переводить юникодными строками, по всем правилам. А именно (как вариант): создать текстовый файл в юникоде (любым редактором, поддерживающим эту кодировку), вписать туда нужные строки, открыть шестнадцатеричным редактором и нужные коды перенести из этого текста в программу.
Почему же, ё-моё, ты нигде не пишешь "ё"?

Оффлайн Балаганов

  • Новичок
  • *
  • Сообщений: 36
    • http://ez7pac.narod.ru/
Кодировка?
« Ответ #4 : 12 Апреля 2006, 21:55:32 »
CaptainFlint, Спасибо за подробное объяснение!
Сразу возникает следующий вопрос по поводу:
Цитировать
создать текстовый файл в юникоде (любым редактором, поддерживающим эту кодировку)

Блокнот в качестве этого редактора подойдет, в нем, вроде, поддержка юникода есть?

Оффлайн CaptainFlint

  • Старожил
  • ****
  • Сообщений: 297
    • http://flint-inc.ru/
Кодировка?
« Ответ #5 : 12 Апреля 2006, 23:00:43 »
Балаганов
Цитировать
Блокнот в качестве этого редактора подойдет, в нем, вроде, поддержка юникода есть?

Да, если речь идёт о Win2000/XP.
Почему же, ё-моё, ты нигде не пишешь "ё"?

Оффлайн Балаганов

  • Новичок
  • *
  • Сообщений: 36
    • http://ez7pac.narod.ru/
Кодировка?
« Ответ #6 : 13 Апреля 2006, 01:44:09 »
CaptainFlint, спасибо  .  Буду мучить прогу дальше.