c++ - C++ 中 CString 的字节数

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

我有一个 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/

相关文章:

php - 选择时默认使用集合名称 'utf8'有什么不好的影响吗?

c# - 如何强制 .NET (C#) 使用方法的非泛型重载?

c++ - 我可以防止使用重载运算符 == 与 NULL 进行比较吗?

assembly - 使用 Windows WinAPI 函数写入控制台 Unicode (UTF-16) 文本?

php - ZendFramework 在插入到 mysql 时从第一个非 a-z 字符开始剪切字符串

php - mysql 查询中的阿拉伯值被数据库忽略

C++ 三元运算符的使用

c++ - 模板与类似的非模板函数

java - Android 的奇怪问题,程序可以编译但无法运行

svg - 在什么情况下,一种字体的每个 unicode 字符可以有多个字形,这是如何处理的?