機能c32rtomb
とmbrtoc32
は、UTF-32 及び "マルチバイト文字" との間の変換を行うようにCユニコードTR(draft)に記載されています。c32rtombはどのようなエンコードに変換しますか? <code><cuchar></code>/<code><uchar.h></code>から
(...)
s
がヌル ポインタでない場合、c32rtomb
関数がシフト配列を含むc32
(によって与えられたワイド文字に対応するマルチバイト文字を 表現するのに必要なバイト数を決定)、によって最初の要素がポイントされている配列を に格納します。 (...)
この「マルチバイト文字表現」とは何ですか?私は、次のプログラムの動作中に実際に興味がある:
#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 'setlocale()'が '" C "'以外の引数で呼び出された場合、yesとなります。実行エンコーディングがASCIIと互換性があるシステムでは、例えば 'setlocale(" en_US.EBCDIC ")'(明白な意味を持つサポートされたロケールであると仮定します)では 'c32rtomb()'がEBCDIC文字列を生成し、 'std :: string 「狭い」はASCII符号化されたままである。 – bames53