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

Won*_*ong 4 c++ unicode winapi

我决定将我的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, "???? ?????");
Run Code Online (Sandbox Code Playgroud)

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

  • 使用Unicode:

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

#define UNICODE
#include <windows.h
Run Code Online (Sandbox Code Playgroud)

现在在窗口过程中:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

请帮忙.谢谢.

Mar*_*nen 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"",则无需定义UNICODE:

#include <windows.h>

int main()
{
    MessageBoxW(NULL,L"? ? ? ? ? ? ? ? ?",L"??",MB_OK);
}
Run Code Online (Sandbox Code Playgroud)

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

图像损坏

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

正确的形象

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

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