簡単な答え:幅の広い文字列に使用される文字セットはwchar_t
、コンパイル時に既知の特性によって決定されます。ライブラリ関数と同様mbtowc
に、これはlibcがビルドされているときに発生します。
mbtowc
外部文字セットにエンコードされた文字列から1文字を読み取り、wchar_t
任意の文字を表すことができる値に書き込みます。同様にmbstowcs
、外部でエンコードされたC文字列をの単純な配列に変換しwchar_t
ます。システムの観点からは、結果のワイド文字/文字列の「文字セット」を指定することは意味がありません。出力エンコーディングを変更すると、結果のワイド文字列をの配列として使用できなくなるためですwchar_t
。
ワイド文字がISO10646コードポイントに対応し、の幅に応じて、UCS-2またはUCS-4(より正確にはUTF-16またはUTF-32)などの固定幅Unicodeエンコーディングを生成すると説明 できます。プロセッサのの表現のエンディアンに応じて、リトルエンディアンまたはビッグエンディアンとして説明することもできます。ただし、これらはプラットフォームのプロパティであり、エンディアン、またはASCIIからEBCDICに変更できる以上に、実行時に変更することはできません。mbstowcs
wchar_t
wchar_t
-fwide-exec-charset
array-of-の内部表現に対応する文字セットをコンパイラに明示的に指定するのに役立ちますwchar_t
。これは、コンパイラーが通常生成する表現とは異なる場合に役立ちます(クロスコンパイルしているため、またはコンパイラーが誤って構成されているため)。これが、マニュアルが「に正確に適合しないエンコーディングで問題が発生する」と警告している理由ですwchar_t
。