【发布时间】:2010-10-05 00:33:01
【问题描述】:
关于 UTF-8 支持和各种 Win32 API 的快速问题。
在典型的 C++ MFC 项目中,MessageBox() 是否可以显示 UTF-8 编码的字符串?
谢谢, 安德鲁
【问题讨论】:
标签: c++ winapi mfc localization utf-8
关于 UTF-8 支持和各种 Win32 API 的快速问题。
在典型的 C++ MFC 项目中,MessageBox() 是否可以显示 UTF-8 编码的字符串?
谢谢, 安德鲁
【问题讨论】:
标签: c++ winapi mfc localization utf-8
快速回答:没有。
更长的答案:如果字符串只包含常规的 ANSI 字符,例如美国英语,它将起作用,因为这些字符代码在 UTF-8 和 ANSI 中是相同的。
如果包含非 ANSI 字符或任何双字节编码字符,则需要使用 MultiByteToWideChar 和 CP_UTF8 转换为 Unicode-16。您的程序还需要使用定义的 UNICODE 进行编译,或者您可以使用“W”API 调用 - 例如消息框W。
(请注意,采用文本参数的函数,如 MessageBox、CreateWindow 映射到“A”或“W”版本,具体取决于是否定义了 UNICODE)。
这也可能有用;
【讨论】:
不,将MultiByteToWideChar 与CP_UTF8 一起使用。请参阅http://www.siao2.com/2006/10/11/816996.aspx 了解为什么 A 不能这样做; W (UCS-2) 是唯一的选择。
【讨论】:
我使用 ATL/MFC 字符串转换宏。例如,如果您有一个名为 myUTF8Str 的 ASCII 字符串,其中包含 UTF8 字符:
::MessageBox(hWnd, CA2T(myUTF8Str, CP_UTF8), _T("Caption"), MB_OK);
或者,您可以创建字符串的实例,例如:
CA2T myConvertedString(myUTF8Str, CP_UTF8);
...
TRACE(_T("Converted: %s\n"), myUTF8Str.m_psz);
注意m_psz 成员,它允许对原始字符串指针进行只读访问。
您也可以使用CT2A 进行编码,例如:
CT2A myEncodedString("Some UTF8", CP_UTF8);
如果不使用 TEXT 宏,则使用 CA2W、CW2A 等。
【讨论】: