воскресенье, 16 мая 2010 г.

Не спускайте глаз с кодовой страницы - практический экзамен

Это перевод Keep your eye on the code page, practical exam. Автор: Реймонд Чен.

Инструкция, которая прилагалась к моему монитору, написана на нескольких языках. Один из них - польский, ну или, хотя бы, он должен быть польским, если бы... ну, смотрите сами.
UWAGA: Szczegó³owe informacje dla u¿ytkownika znajduj¹ siê na do³¹czonej p³ycie CD.
Это тарабарщина. На самом деле, они хотели написать:
UWAGA: Szczegółowe informacje dla użytkownika znajdują się na dołączonej płycie CD.
(что означает: "Примечание: подробная информация для пользователя включена на CD")

Что же пошло не так? Почему все символы со штрихами, кроме одного, оказались испорченными?

Компания, которая делала инструкцию, не смогла уследить за кодовой страницей. Текст, который отдал им польский переводчик, был в кодовой странице 1250 (центральная Европа). Если вы приложите табличку этой кодовой страницы к табличке кодовой страницы 1252 (Latin I), то вы увидите, откуда идёт проблема. Компания взяла строку в кодовой странице 1250 и распечатала её в кодовой странице 1252. Например, символ "ł" расположен в позиции B3 страницы 1250; аналогичный символ в этой же позиции в кодовой странице 1252 - "³".

Я только надеюсь, что их польские клиенты сумели сообразить, о чём говорит инструкция.

Окей, это был их практический экзамен на кодировки. А вот ваш:
Я работаю в испанской версии Windows 2003 и вызываю
WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, pwzStr, -1, pszStr, nRet, nil, pbUsedDefault);
Когда я передаю Unicode строку
D:\Documents and Settings\ABC\Configuración local\
этот код создаёт следующую строчку и не устанавливает pbUsedDefault:
D:\Documents and Settings\ABC\Configuraci¢n local\
Почему не устанавливается pbUsedDefault?
Фактически, я подброшу вам два дополнительных вопроса: (1) Как следует этому клиенту изменить код, чтобы правильно получать путь? и (2) Почему? Важным здесь является ответ именно на второй вопрос.

2 комментария:

  1. Очепятка. В тексте стоит "Одним из них - Польский"

    ОтветитьУдалить
  2. Почему? А потому, что он переводит Unicode-строку в OEM-кодировку. OEM-кодировка испанского — это MS-DOS Multilingual, она же Latin I, она же CP850. "О" с ударением имеет там код $A2, поэтому преобразование пройдет спокойно и без ошибок. Интереснее вопрос "почему же виден цент?" Дело в том, что в испанской Windows системной кодировкой является все-таки Windows-1252, в которой на кодовой позиции $A2 стоит что? символ цента!
    Между прочим, в оригинальном посте перед выходной строкой стоит "it returns the multibyte string below", а какая кодировка у многобайтной строки? Вот и Windows думает, что системная, Windows-1252, и при вызове MessageBox, например (хоть A, хоть W), нарисует нам цент. Итак, как исправить? Да очень просто:
    WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, pwzStr, -1, pszStr, nRet, nil, pbUsedDefault);
    На выходе получится строка в системной кодировке, с которой можно будет жить без проблем.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.