我决定将我的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)。
我在包含标题之前添加了:
#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()
?? 请帮助。谢谢。
答案 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)并错误地解码了宽字符串。
结果(UTF-8 w / BOM)。编译器检测BOM并使用UTF-8解码源代码,从而为宽字符串生成正确的数据。
一个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
。
现在我编译并构建程序设置一些按钮,将编辑控件的文本更改为阿拉伯字符串。结果我得到了我想要的!谢谢大家!