関数c32rtomb
およびmbrtoc32
from <cuchar>
/<uchar.h>
は、C Unicode TR (ドラフト) で、UTF-32 1と「マルチバイト文字」の間の変換を実行するものとして説明されています。
(...)
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);
}
その中のアサーションは1を保持することが保証されていますか?
1__STDC_UTF_32__
定義された仮定の下で作業する。