MFC应用程序中的多字节字符集

时间:2008-11-27 20:45:10

标签: c++ unicode mfc

我有一个MFC应用程序,我想在其中添加国际化支持。该项目配置为使用“多字节字符集”(在我的情况下,“unicode字符集”不是一个选项)。

现在,如果我将键盘设置为某种外语,我希望CWnd :: OnChar()函数能够向我发送多字节字符,但它似乎不会那样工作。 OnChar()函数总是在其nChar变量中向我发送一个1字节的字符。

我认为_getmbcp()函数会为我提供应用程序的当前代码页,但此函数始终返回0.

任何建议都将受到赞赏。

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

至于更改默认代码页:

用户的默认代码页(适用于WinXP - 不确定它在Vista上的位置)是在“高级”选项卡的“区域和语言选项”控制面板小程序中设置的。

“非Unicode程序的语言”设置当前用户的默认代码页。不幸的是,它实际上并没有告诉你它正在配置的代码页编号 - 它只是提供了语言(可能会使用区域变体进一步指定)。这从终端用户的角度来看是有道理的,因为我认为代码页数对99.999%的最终用户没有意义。您需要重新启动才能使更改生效。如果你使用regmon来确定哪些更改你可能会想出一些指定默认代码页更容易的东西。

Microsoft还有一个不受支持的实用程序AppLocale,用于测试更改特定应用程序代码页的本地化:http://www.microsoft.com/globaldev/tools/apploc.mspx

您也可以通过调用SetThreadLocale()来更改线程的代码页 - 但您还必须调用C运行时的setlocale()函数,因为某些CRT函数不与Win API语言环境函数通信(反之亦然)。有关详细信息,请参阅Chris Grimes的"Windows SetThreadLocale and CRT setlocale"

答案 2 :(得分:2)

对于_getmbcp,MSDN说“返回值为0表示正在使用单字节代码页。”这肯定使它不是很有用。尝试以下方法之一:GetUserDefaultLCID GetSystemDefaultLCID GetACP。 (现在为什么GetACP没有“用户”等价物?)

无论如何,如果您希望_getmbcp返回实际值,请将系统默认语言设置为中文,日语或韩语。

答案 3 :(得分:2)

与非Unicode场景一样,只有在相应地设置系统区域设置(也称为“控制面板”非语言应用程序的语言“)时,才能获得可靠的结果。如果没有,不要期待任何好事。

例如,如果系统区域设置是繁体中文,您将收到2条连续的WM_CHAR消息(每个字节一个,假设用户组成一个2字符字符)。

isleadbyte()应该可以帮助您确定第二个字节是否即将推出。

如果您的系统区域设置未设置为中文,即使使用中文键盘/ IME,也不要期望收到正确的消息。误导性部分是某些情况有效。例如使用希腊语键盘,即使您的系统区域设置是基于拉丁语的,您也会收到基于希腊语代码页的WM_CHAR字符值。但是你应该远离尝试应对这种情况:成功无法保证,并且可能会因Windows版本和区域设置而异。

正如MikeB所写,MS AppLocale是您进行基本测试的朋友。

[ad]和appTranslator是您的朋友,如果您需要翻译您的用户界面[/ ad]

答案 4 :(得分:0)

实际上有一种非常简单(但很奇怪)的强制方法是强制OnChar函数将unicode字符发送到应用程序,即使它是以多字节字符集配置的:

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

只需调用unicode版本的“SetWindowLong”,它就会强制应用程序接收unicode字符。