功能c32rtomb
和從<cuchar>
/<uchar.h>
mbrtoc32
在C的Unicode TR(draft)爲UTF-32 和 「多字節字符」 之間執行轉換描述。c32rtomb轉換爲什麼編碼?
(...)如果
s
不是一個空 指針,c32rtomb
函數確定以表示 對應於由c32
(包括任何移位序列給出的寬字符的多字節字符所需的字節數),並將多字節字符表示存儲在 中的第一個元素由s
指向的數組中。 (...)
什麼是「多字節字符表示」?我在下面的程序的行爲實際上感興趣的是:
#include <cassert>
#include <cuchar>
#include <string>
int main() {
std::u32string u32 = U"this is a wide string";
std::string narrow = "this is a wide string";
std::string converted(1000, '\0');
char* ptr = &converted[0];
std::mbstate_t state {};
for(auto u : u32) {
ptr += std::c32rtomb(ptr, u, &state);
}
converted.resize(ptr - &converted[0]);
assert(converted == narrow);
}
是它保證持有的說法對嗎?
該__STDC_UTF_32__
定義的假設下工作。
不錯的答案。要明確一點:如果他向'setlocale'添加了一個調用,那麼斷言可能會失敗,即使他的字符串完全在基本字符集內? – Nemo
@Nemo如果用'C「以外的參數調用'setlocale()',是的。例如,在執行編碼與ASCII兼容的系統上,'setlocale(「en_US.EBCDIC」)'(假設這是受支持的語言環境,其含義明顯)會導致'c32rtomb()'產生EBCDIC字符串,而'std :: string窄'將保持ASCII編碼。 – bames53