【问题标题】:WinAPI and UTF-8 supportWinAPI 和 UTF-8 支持
【发布时间】:2010-10-05 00:33:01
【问题描述】:

关于 UTF-8 支持和各种 Win32 API 的快速问题。

在典型的 C++ MFC 项目中,MessageBox() 是否可以显示 UTF-8 编码的字符串?

谢谢, 安德鲁

【问题讨论】:

    标签: c++ winapi mfc localization utf-8


    【解决方案1】:

    快速回答:没有。

    更长的答案:如果字符串只包含常规的 ANSI 字符,例如美国英语,它将起作用,因为这些字符代码在 UTF-8 和 ANSI 中是相同的。

    如果包含非 ANSI 字符或任何双字节编码字符,则需要使用 MultiByteToWideChar 和 CP_UTF8 转换为 Unicode-16。您的程序还需要使用定义的 UNICODE 进行编译,或者您可以使用“W”API 调用 - 例如消息框W。

    (请注意,采用文本参数的函数,如 MessageBox、CreateWindow 映射到“A”或“W”版本,具体取决于是否定义了 UNICODE)。

    这也可能有用;

    http://www.joelonsoftware.com/articles/Unicode.html

    【讨论】:

    • 只是一些术语,但它被称为 UTF-16。没有像 Unicde-16 这样的东西。 :)
    • 这篇 Joel 的文章已经很老了,他确实淡化了 UTF-8,它是技术上最方便的 Unicode 编码。他自己关于查找 HTML 元标记的想法仅适用于 UTF-8 或某些单字节(ASCII 派生)编码。否则,你会得到零值字节,这使得查找 '
    • 另请注意,WinAPI 的大部分实际上更像 UCS-2,而不是 UTF-16,因为至少 WinAPI 的某些部分(哪个?我不知道——这一切似乎都是而是命中和错过)将无法正确处理代理对;换句话说,他们会假设 UTF-16 是固定宽度的编码。
    【解决方案2】:

    不,将MultiByteToWideCharCP_UTF8 一起使用。请参阅http://www.siao2.com/2006/10/11/816996.aspx 了解为什么 A 不能这样做; W (UCS-2) 是唯一的选择。

    【讨论】:

    • +1 几乎没有挑剔:W 版本是 UTF-16,而不是 UCS-2 - 它也处理代理对。
    【解决方案3】:

    我使用 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 等。

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      相关资源
      最近更新 更多