Инструкция, которая прилагалась к моему монитору, написана на нескольких языках. Один из них - польский, ну или, хотя бы, он должен быть польским, если бы... ну, смотрите сами.
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 и вызываюФактически, я подброшу вам два дополнительных вопроса: (1) Как следует этому клиенту изменить код, чтобы правильно получать путь? и (2) Почему? Важным здесь является ответ именно на второй вопрос.
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?
Очепятка. В тексте стоит "Одним из них - Польский"
ОтветитьУдалитьПочему? А потому, что он переводит 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);
На выходе получится строка в системной кодировке, с которой можно будет жить без проблем.