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

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

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

我认为这是非常普遍的要求,但是即使经过1.5小时的搜索和试验,我仍然找不到正确的解决方案。

我对Windows编程的经验很少,所以也许我遗漏了一些关键信息。 如果您有这种感觉,请告诉我,我们会添加您要求的所有信息。

===============>>#1 票数:5 已采纳

由于您的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 ,则需要使用MultiByteToWideChar将字符串转换为UTF-16,然后使用WideCharToMultibyte从UTF-16转换为UTF-8。 请参阅如何将ANSI字符串直接转换为UTF-8? 但是无论如何,在没有Unicode支持的情况下,绝不应编译新代码

  ask by Kejml translate from so

未解决问题?本站智能推荐: