你能向我解釋一下究竟是mbstate_t什么嗎?我已經閱讀了cppreference description,但我仍然不明白它的目的。我所理解的是,mbstate_t對于有限的一組函式(例如mbtowc(),wctomb()等),一些靜態結構是可見的,但我仍然對如何使用它感到困惑。我可以在 cppreference 示例中看到,在呼叫某些函式之前應該重置此結構。假設,我想計算多語言字串中的字符數,如下所示:
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 回圈mbstate_t結構之前,應通過呼叫mbtowc()所有引數為零來重置。這樣做的目的是什么?
uj5u.com熱心網友回復:
的界面mbtowc有點瘋狂。我猜是歷史錯誤。
您不需要向它傳遞一個完整的字串,但可以傳遞一個以不完整的多位元組字符結尾的緩沖區(可能是一個網路包)。然后在下一次呼叫中傳遞剩余的字符。
因此mbtowc必須在呼叫之間存盤其當前(可能是部分)轉換狀態。可能作為靜態變數。
呼叫std::mbtowc(nullptr, 0, 0);將清除此內部狀態,因此它已準備好接收新字串。
您可能想mbrtowc改用并提供非隱藏mbstate_t作為額外引數。
https://en.cppreference.com/w/cpp/string/multibyte/mbrtowc
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388770.html
上一篇:C 元件和空指標
