我有一个 Unicode 字符串存储在 CString
中,我需要知道该字符串在 UTF-8 编码中占用的字节数。我知道 CString 有一个方法 getLength()
,但它返回字符数,而不是字节数。
我尝试(除了其他事情)转换为 char 数组,但我(从逻辑上来说,我猜)只得到 wchar_t
数组,所以这并不能解决我的问题。
明确我的目标。对于输入,可以说 "aaa"
我想要“3”作为输出(因为“a”在 UTF-8 中占用一个字节)。但对于输入“āaa”,我希望看到输出“4”(因为ā是两个字节字符)。
我认为这一定是很常见的请求,但即使经过 1.5 小时的搜索和实验,我也找不到正确的解决方案。
我对 Windows 编程的经验很少,所以也许我遗漏了一些重要的信息。如果您有这样的感觉,请告诉我,我会添加您要求的任何信息。
最佳答案
由于您的 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
Size, in bytes, of the buffer indicated by lpMultiByteStr. If this parameter is set to 0, the function returns the required buffer size for lpMultiByteStr and makes no use of the output parameter itself.
在这种情况下,该函数将返回 UTF-8 格式的字节数,而不会真正输出任何内容
int utf8_len = WideCharToMultiByte(CP_UTF8, 0, instr, -1, NULL, 0, NULL, NULL);
如果你的CString确实是CStringA
,即_UNICODE
没有定义,那么你需要使用MultiByteToWideChar
将字符串转换为UTF- 16,然后使用 WideCharToMultibyte
将 UTF-16 转换为 UTF-8。请参阅How do I convert an ANSI string directly to UTF-8?但无论如何,在没有 Unicode 支持的情况下,永远不应该编译新代码
关于c++ - C++ 中 CString 的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177430/