Многобайтовый набор символов в приложении MFC - PullRequest
0 голосов
/ 27 ноября 2008

У меня есть приложение MFC, в которое я хочу добавить поддержку интернационализации. Проект настроен на использование «многобайтового набора символов» («набор символов Юникода» не подходит в моей ситуации).

Теперь я ожидаю, что функция CWnd :: OnChar () будет отправлять мне многобайтовые символы, если я установлю на клавиатуре какой-нибудь иностранный язык, но, похоже, это не сработает. Функция OnChar () всегда отправляет мне 1-байтовый символ в своей переменной nChar.

Я думал, что функция _getmbcp () выдаст мне текущую кодовую страницу для приложения, но эта функция всегда возвращает 0.

Любой совет будет оценен.

Ответы [ 5 ]

2 голосов
/ 28 ноября 2008

Как всегда в сценариях, отличных от Unicode, вы получите надежный результат только в том случае, если языковой стандарт системы (также называемый на панели управления «язык для приложений, не поддерживающих Юникод») установлен соответствующим образом. Если нет, не ожидайте ничего хорошего.

Например, если языковой стандарт системы - китайский традиционный, вы получите 2 последовательных сообщения WM_CHAR (по одному на каждый байт, при условии, что пользователь состоит из двухсимвольного символа).

isleadbyte () должен помочь вам определить, скоро ли появится второй байт.

Если ваша системная локаль НЕ установлена ​​на китайском языке, не ожидайте получения правильных сообщений, даже используя китайскую клавиатуру / IME. Вводящая в заблуждение часть заключается в том, что некоторые сценарии работают. например используя греческую клавиатуру, вы получите значения символов WM_CHAR на основе греческой кодовой страницы, даже если ваша системная локаль основана на латинице. Но вам действительно следует избегать попыток справиться с такими сценариями: успех не гарантирован и, скорее всего, будет зависеть от версии Windows и локали.

Как писал MikeB, MS AppLocale - ваш друг для базовых тестов.

[ad] и appTranslator - ваш друг, если вам нужно перевести свой интерфейс [/ ad]

2 голосов
/ 28 ноября 2008

Что касается изменения кодовой страницы по умолчанию:

Кодовая страница по умолчанию для пользователя (для WinXP - не знаю, как она работает в Vista) установлена ​​в апплете панели управления «Язык и региональные стандарты» на вкладке «Дополнительно».

«Язык для программ, не поддерживающих Юникод», задает кодовую страницу по умолчанию для текущего пользователя. К сожалению, на самом деле он не сообщает вам номер кодовой страницы, которую он настраивает, он просто дает язык (который может быть дополнительно указан в варианте региона). Это имеет смысл с точки зрения конечного пользователя, потому что я думаю, что номера кодовых страниц не имеют значения для 99,999% конечных пользователей. Вам нужно перезагрузиться, чтобы изменения вступили в силу. Если вы используете regmon, чтобы определить, какие изменения вы, вероятно, могли бы придумать с чем-то, что несколько проще определяет кодовую страницу по умолчанию.

Microsoft также имеет неподдерживаемую утилиту AppLocale для тестирования локализации, которая изменяет кодовую страницу для определенных приложений: http://www.microsoft.com/globaldev/tools/apploc.mspx

Также вы можете изменить кодовую страницу для потока, вызвав SetThreadLocale() - но вы также должны вызвать функцию setlocale() среды выполнения C, потому что некоторые функции CRT не взаимодействуют с функциями локали Win API (и наоборот). ). Подробнее см. "Windows SetThreadLocale и CRT setlocale" от Chris Grimes.

2 голосов
/ 28 ноября 2008

Для _getmbcp MSDN говорит: «Возвращаемое значение 0 указывает, что используется однобайтовая кодовая страница». Это делает его не очень полезным. Попробуйте один из них: GetUserDefaultLCID GetSystemDefaultLCID GetACP. (Теперь, почему не существует «пользовательского» эквивалента для GetACP?)

В любом случае, если вы хотите, чтобы _getmbcp возвращал фактическое значение, установите для языка системы по умолчанию китайский, японский или корейский.

2 голосов
/ 28 ноября 2008
0 голосов
/ 03 декабря 2008

На самом деле существует очень простой (но странный) способ заставить функцию OnChar отправлять символы Юникода в приложение, даже если она настроена в многобайтовом наборе символов:

SetWindowLongW( m_hWnd, GWL_WNDPROC, GetWindowLong( m_hWnd, GWL_WNDPROC ) );

Просто вызывая Unicode-версию SetWindowLong, он заставляет приложение получать Unicode-символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...