【问题标题】:Visual Studio multibyte chars to single bytesVisual Studio 多字节字符到单字节
【发布时间】:2014-01-05 12:26:26
【问题描述】:

有没有一种简单的方法可以将多字节 UTF8 数据(来自 Google Contacts API 通过https://www.google.com/m8/feeds/)转换为单字节?我知道扩展的 ASCII 集是非标准的,但是,例如,我的程序将在 MFC CListBox 中显示信息,很高兴将“E 急性”显示为 0xE9。我只需要它来处理一些类似的欧洲符号。我发现我可以使用 MultiByteToWideChar() 转换所有内容,但如果可能的话,我不想更改很多函数来接受宽字符。 谢谢。

【问题讨论】:

  • 你想要 UTF8 转 ANSI 吗?
  • 我想你可以做一个 MultiByteToWideChar 然后 WideCharToMultiByte 并相应地设置代码页参数。 YMMV 和您所说的那些欧洲符号可能不会在 Windows 的每个区域设置中以相同的方式呈现。使用 unicode(宽字符)将产生更一致的结果。
  • MBCS 对 MFC 的支持正在逐步淘汰。 Visual Studio 2013 不再附带对 MFC 的 MBCS 支持(尽管有单独的下载)。趁还有时间,最好更改您的代码以使用 Unicode。

标签: c++ mfc char google-contacts-api multibyte


【解决方案1】:

如果您需要将char *UTF8转换为ANSI,请尝试以下函数:

// change encoding from UTF8 to ANSI
char* change_encoding_from_UTF8_to_ANSI(char* szU8)
{ 
    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
    wchar_t* wszString = new wchar_t[wcsLen + 1];
    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
    wszString[wcsLen] = '\0';

    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
    char* szAnsi = new char[ansiLen + 1];
    ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
    szAnsi[ansiLen] = '\0';

    delete []wszString;
    return szAnsi;
}

【讨论】:

  • wszString 内存泄漏
  • 非常感谢您的帮助 - 上面的功能很好用。如果我知道有一个词 - ANSI - 因为我在那之后会有所帮助!有关 MFC 的警告也已加入。
【解决方案2】:

Utf8 具有与 Ascii 字符的一对一映射,因此如果您将 Ascii 字符作为 utf8 接收,AFAIK 您可以直接将它们读取为 Ascii。如果您有非 Ascii 字符,那么您将无法在 Ascii 中表达它们(任何字节 > 0x80)

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2021-03-27
    • 2016-03-28
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多