【问题标题】:Number of bytes of CString in C++C++ 中 CString 的字节数
【发布时间】:2014-06-04 08:08:21
【问题描述】:

我有一个 Unicode 字符串存储在 CString 中,我需要知道这个字符串在 UTF-8 编码中占用的字节数。我知道 CString 有一个方法 getLength(),但它返回字符数,而不是字节数。

我尝试(除其他外)转换为 char 数组,但我得到(逻辑上,我猜)只有 wchar_t 的数组,所以这并不能解决我的问题。

明确我的目标。对于输入,让我们说"aaa" 我想要“3”作为输出(因为“a”在 UTF-8 中占用一个字节)。但是对于输入“āaa”,我希望看到输出“4”(因为 ā 是两个字节字符)。

我认为这一定是很常见的要求,但即使经过 1.5 小时的搜索和试验,我也找不到正确的解决方案。

我对 Windows 编程的经验很少,所以我可能遗漏了一些重要信息。如果您有这种感觉,请告诉我,我会添加您要求的任何信息。

【问题讨论】:

    标签: c++ unicode utf-8 mfc c-strings


    【解决方案1】:

    由于您的 CString 包含一系列 wchar_t,因此您可以使用 WideCharToMultiByte,输出字符集为 CP_UTF8。该函数将返回写入输出缓冲区的字节数,或 UTF-8 编码字符串的长度

    LPWSTR instr;
    char outstr[MAX_OUTSTR_SIZE];
    int utf8_len = WideCharToMultiByte(CP_UTF8, 0, instr, -1, outstr, MAX_OUTSTR_SIZE, NULL, NULL);
    

    如果你不需要输出字符串,你可以简单地将输出缓冲区大小设置为0

    • cbMultiByte

      lpMultiByteStr 指示的缓冲区大小,以字节为单位。如果此参数设置为 0,则函数返回 lpMultiByteStr 所需的缓冲区大小,并且不使用输出参数本身。

    在这种情况下,函数将返回 UTF-8 格式的字节数,而不会真正输出任何内容

    int utf8_len = WideCharToMultiByte(CP_UTF8, 0, instr, -1, NULL, 0, NULL, NULL);
    

    如果你的CString真的是CStringA,即_UNICODE没有定义,那么你需要使用Multi­Byte­To­Wide­Char将字符串转换为UTF-16,然后再用@987654332从UTF-16转换为UTF-8 @。见How do I convert an ANSI string directly to UTF-8? 但无论如何都不应在没有Unicode支持的情况下编译新代码

    【讨论】:

    • 请记住,如果您将cchWideChar 参数设置为-1,WideCharToMultiByte() 会考虑空终止符,并且结果长度包括空终止符。如果您不想这样,则必须将cchWideChar 设置为传递给lpWideCharStr 参数的数据的实际长度。
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多