你能给我解释一下mbstate_t
到底是什么吗?我已经阅读了cppreference的描述,但我仍然不明白它的目的。我所理解的是,mbstate_t
是一些静态结构,对于mbtowc()
、wctomb()
等有限的函数集是可见的,但我仍然不知道如何使用它。我在cpprreference示例中看到,在调用某些函数之前,应该重置这个结构。假设,我想计算多语言字符串中的字符数,如以下所示:
std::string str = "Hello! Привет!";
显然,str.size()
不能在本例中使用,因为它只是返回字符串中的字节数。但像这样的东西起到了作用:
std::locale::global(std::locale("")); // Linux, UTF-8
std::string str = "Hello! Привет!";
std::string::size_type stringSize = str.size();
std::string::size_type nCharacters = 0;
std::string::size_type nextByte = 0;
std::string::size_type nBytesRead = 0;
std::mbtowc(nullptr, 0, 0); // What does it do, and why is it needed?
while (
(nBytesRead = std::mbtowc(nullptr, &str[nextByte], stringSize - nextByte))
!= 0)
{
++nCharacters;
nextByte += nBytesRead;
}
std::cout << nCharacters << 'n';
根据cppreference示例,在进入while循环之前,应通过调用mbtowc()
重置mbstate_t
结构,所有参数均为零。这样做的目的是什么?
mbtowc
的接口有点疯狂。我想这是一个历史错误。
您不需要向其传递完整的字符串,但可以传递以不完整的多字节字符结尾的缓冲区(可能是网络包(。然后在下一个调用中传递角色的其余部分。
因此,mbtowc
将不得不在调用之间存储其当前(可能是部分(转换状态。可能是作为一个静态变量。
对std::mbtowc(nullptr, 0, 0);
的调用将清除此内部状态,因此它已为新字符串做好准备。
您可能需要使用mbrtowc
,并提供一个非隐藏的mbstate_t
作为额外参数。
https://en.cppreference.com/w/cpp/string/multibyte/mbrtowc