C++ C+中CString的字节数+;

C++ C+中CString的字节数+;,c++,unicode,utf-8,mfc,c-strings,C++,Unicode,Utf 8,Mfc,C Strings,我在CString中存储了一个Unicode字符串,我需要知道这个字符串在UTF-8编码中的字节数。我知道CString有一个方法getLength(),但它返回的是字符数,而不是字节数 我尝试(除其他外)转换为char数组,但(逻辑上,我猜)只得到wchar\u t的数组,所以这并不能解决我的问题 明确我的目标。对于输入,假设“aaa”我想要“3”作为输出(因为“a”在UTF-8中占用一个字节)。但是对于输入“āaa”,我希望看到输出“4”(因为ā是两字节字符) 我认为这是一个非常普遍的要求,

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

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

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

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


我对Windows编程的经验很少,所以可能遗漏了一些重要信息。如果您愿意,请让我知道,我将添加您要求的任何信息。

由于您的CString包含一系列
wchar\u t
,您可以将输出字符集用作
CP\u 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
,即未定义
\u UNICODE
,那么您需要使用
多字节到宽字符
将字符串转换为UTF-16,然后使用
宽字符到多字节
从UTF-16转换为UTF-8。请参阅,但是在没有Unicode支持的情况下,无论如何都不应该编译新代码

因为您的CString包含一系列的
wchar\u t
,您可以将输出字符集用作
CP\u 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
,即未定义
\u UNICODE
,那么您需要使用
多字节到宽字符
将字符串转换为UTF-16,然后使用
宽字符到多字节
从UTF-16转换为UTF-8。请参阅,但无论如何,在没有Unicode支持的情况下,绝不应编译新代码。请记住,如果将
cchWideChar
参数设置为-1,
WideCharToMultiByte()
将考虑空终止符,生成的长度包括空终止符。如果您不想这样做,则必须将
cchWideChar
设置为传递给
lpWideCharStr
参数的数据的实际长度。请记住,如果将
cchWideChar
参数设置为-1,
WideCharToMultiByte()
将考虑空终止符,结果长度包括空终止符。如果不希望这样,则必须将
cchWideChar
设置为传递给
lpWideCharStr
参数的数据的实际长度。