为什么我的应用程序无法正确显示unicode字符?

时间:2017-10-17 21:25:25

标签: c++ winapi unicode

我决定将我的win32 c ++应用程序转换为Unicode版本,但是当我使用它时,我收到了阿拉伯语,中文和日语的不可读信件......

首先:

如果我不使用Unicode,我在编辑框中获得了阿拉伯语ok窗口标题:

HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "ا ب ت ث ج ح خ د ذ", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10, 10, 300, 200, hWnd, (HMENU)100, GetModuleHandle(NULL), NULL);

SetWindowText(hWnd, "صباح الخير");

输出似乎没问题,工作正常! (没有unicode)。

  • 使用Unicode:

我在包含标题之前添加了:

#define UNICODE
#include <windows.h

现在在Window Procedure:

case WM_CREATE:{
    HWND hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"Edit", L"ا ب ت ث ج ح خ د ذ", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10, 10, 300, 200, hWnd, (HMENU)100, GetModuleHandle(NULL), NULL);

    // Even I send message to change text but I get unreadable characters!
}
break;
case WM_LBUTTONDBLCLK:{
    SendDlgItemMessageW(hWnd, 100, WM_SETTEXT, 0, (LPARAM)L"السلام عليكم"); // Get unreadable characters also
}
break;

正如您在Unicode中看到的那样,控件无法正确显示阿拉伯字符。

  • 重要的是:创建控件后我用backspace手动删除内容现在如果我手动输入阿拉伯文本它成功显示正确吗?!!!但为什么温使用函数呢?喜欢SetWindowTextW() ??

请帮助。谢谢。

2 个答案:

答案 0 :(得分:10)

确保将源文件保存为带有BOM的UTF-16或UTF-8。许多Windows应用程序否则采用ANSI编码(默认本地化Windows代码页)。您还可以检查编译器开关以强制使用UTF-8作为源文件。例如,MS Visual Studio 2015的编译器具有/utf-8开关,因此不需要使用BOM进行保存。

这是一个保存在UTF-8中的简单示例,然后是UTF-8 w / BOM并使用Microsoft Visual Studio编译器进行编译。请注意,如果您对API的W版本进行硬编码并使用L&#34;&#34;则无需定义UNICODE。对于广泛的字符串:

#include <windows.h>

int main()
{
    MessageBoxW(NULL,L"ا ب ت ث ج ح خ د ذ",L"中文",MB_OK);
}

结果(UTF-8)。编译器采用ANSI编码(Windows-1252)并错误地解码了宽字符串。

Corrupted image

结果(UTF-8 w / BOM)。编译器检测BOM并使用UTF-8解码源代码,从而为宽字符串生成正确的数据。

Correct image

一个Python代码,演示了解码错误:

>>> s='中文,ا ب ت ث ج ح خ د ذ'
>>> print(s.encode('utf8').decode('Windows-1252'))
中文,ا ب ت ث ج ح خ د ذ

答案 1 :(得分:0)

我终于明白了!

1-在编译和构建程序之前:我进入控制面板并将所有内容更改为阿拉伯语(语言)并重新启动计算机。

2- I设置vc ++ 6.0以通过定义宏UNICODE_UNICODE和禁用多字节字符串_MBCS来使用Unicode。

正如@Remy Lebeau建议我在编译器中选择Simplified Arabic字体(Unicode fnot)。

最后,我将输出entrypoint添加到链接器输出wWinMainCRTStartup

现在我编译并构建程序设置一些按钮,将编辑控件的文本更改为阿拉伯字符串。结果我得到了我想要的!谢谢大家!

  • 在VC ++中的东西14没问题我可以轻松定义`unicode。