VerQueryValue и символы Unicode с несколькими кодовыми страницами - PullRequest
1 голос
/ 05 октября 2009

В нашем приложении мы используем API-вызов VerQueryValue () для получения информации о версии, такой как ProductName и т. Д. Для некоторых приложений, работающих на компьютере на традиционном китайском языке (кодовая страница 950), ProductName имеет последовательности Unicode, которые охватывают несколько кодовых страниц некоторые символы не переведены должным образом. Например, в приведенной ниже последовательности

51 00 51 00 6F 8F F6 4E A1 7B 06 74 Некоторые символы возвращаются как недействительные Unicode 0x003f (знак вопроса)

В приведенной выше последовательности Unicode '8F 6F' не воспринимается и не конвертируется должным образом при вызове WinAPI и просто заполняется недопустимым Unicode '00 3F '- поскольку' 8F 6F 'присутствует только в кодовой странице 936 ( т.е. упрощенный китайский)

.exe содержит только одну таблицу перевода - как '\ StringFileInfo \ 080404B0' - которая ссылается на идентификатор языка '804' только для традиционного китайского *

Как следует обращаться с такими случаями - когда ProductName относится к Unicode как из 936, так и из 950, даже если в таблице перевода есть только одна запись? Есть ли другой вызов API для использования?

Кроме того, если бы я щелкнул правой кнопкой мыши на exe и просмотрел вкладку «детали», он правильно показывает название продукта! Так что, похоже, Microsoft использует другой вызов API или как-то справиться с этим правильно. Мне нужно знать, как это так.

Заранее спасибо,

Venkat

1 Ответ

0 голосов
/ 17 октября 2009

Выглядит несколько странно, если содержимое совместимо с codepage1 только в блоке, помеченном как codepage2. Это источник вашей проблемы.

Лучший способ решения проблем с несколькими кодовыми страницами - это, очевидно, превратить ваше приложение в приложение, поддерживающее Юникод. Больше не будет преобразований ни в какие кодовые страницы, что сделает всех счастливыми.

LANGID (0804) является только указанием на язык содержимого в блоке. Если информация о версии имеет несколько блоков, вы можете запрограммировать свое приложение на поиск блока на языке вашего пользователя.

Когда вы вызываете VerQueryValue () в приложении ANSI, этот LANGID не учитывается при преобразовании содержимого Unicode в ANSI: вы - ANSI, поэтому Windows предполагает, что вы понимаете только кодовую страницу ANSI компьютера по умолчанию.

Примечание об отображении на консоли

Остерегайтесь консоли! Это старое существо, которое не полностью знает Unicode. Он основан на кодовых страницах. Поэтому следует ожидать проблем с отображением, которые невозможно устранить. Еще хуже: он использует свою собственную кодовую страницу (называемую кодовой страницей OEM), которая может отличаться от обычной кодовой страницы ANSI (хотя для восточноазиатских языков кодовая страница OEM = кодовая страница ANSI).

НТН.

...