【问题标题】:Visual C++ - UTF-8 - CA2W followed by CW2T with MBCS - Possibly a bad idea?Visual C++ - UTF-8 - CA2W 后跟 CW2T 和 MBCS - 可能是个坏主意?
【发布时间】:2019-03-13 09:57:30
【问题描述】:

我正在使用一个库,该库以 const char* 类型生成 UTF-8 空终止字符串。示例包括:

MIGUEL ANTÓNIO
DONA ESTEFÂNIA

我想将这两个 const char* 类型转换为 CString 以便它们读取:

MIGUEL ANTÓNIO
DONA ESTEFÂNIA

为此,我正在使用我制作的以下功能:

CString Utf8StringToCString(const char * s)
{
    CStringW ws = CA2W(s, CP_UTF8);
    return CW2T(ws);
}

该功能似乎可以满足我的要求(至少对于这两种情况)。但是,我想知道:使用 CA2W 宏,然后使用 CW2T 是否是个好主意?我这样做是在做某种有损转换吗?有什么我需要担心的副作用吗?

其他一些细节:

  1. 我正在使用 Visual Studio 2015
  2. 我的应用程序是使用使用多字节字符集编译的

【问题讨论】:

  • CW2T 将丢失任何无法用您的代码页表示的 Unicode 字符。
  • 为什么您的项目设置仍在 MBCS 上?您还有使用 Windows 98 的客户吗?
  • @selbie 嗯...老实说,我不知道。我们所有的客户都使用 Windows 8,但我相信这是一个遗留应用程序。据我了解,将设置更改为 Unicode 可能会破坏现有代码...
  • @MiguelLopesMartins - 我也这么认为。不过,这很容易解决。请参阅下面的答案。

标签: c++ utf-8 mbcs


【解决方案1】:

即使您的应用程序被编译为 MBCS,您仍然可以毫无问题地使用 Unicode 字符串、缓冲区和 Windows Unicode API。

使用原始指针 (const char*) 或在 CStringstd::string 等字符串类中将字符串作为 UTF-8 传递。当您确实需要渲染字符串进行显示时,转换为 Unicode 并显式使用W API。

例如:

void UpdateDisplayText(const char* s)
{
    CStringW ws = CA2W(s, CP_UTF8);
    SetDlgItemTextW(m_hWnd, IDC_LABEL1, ws);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2010-09-27
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多