什么是mbstate_t,为什么要重置它



你能给我解释一下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

相关内容

  • 没有找到相关文章

最新更新