C++でのエンコードはかなり複雑です。これが私の理解です。
すべての実装は、基本的なソース文字セットの文字をサポートする必要があります。これらには、§2.2/ 1(C ++11では§2.3/1)にリストされている一般的な文字が含まれます。これらの文字はすべて1つに収まる必要がありますchar
。さらに、実装は、またはのuniversal-character-names
ように見える方法を使用して他の文字に名前を付ける方法をサポートする必要があり、Unicode文字を参照するために使用できます。それらのサブセットは識別子で使用できます(付録Eにリストされています)。\uffff
\Uffffffff
これはすべて素晴らしいことですが、ファイル内の文字からソース文字(コンパイル時に使用される)へのマッピングは実装で定義されています。これは、使用されるエンコーディングを構成します。文字通りの内容は次のとおりです(C ++ 98バージョン)。
物理ソースファイルの文字は、必要に応じて、実装で定義された方法で、基本的なソース文字セット(行末インジケーターに改行文字を導入)にマップされます。三重音字シーケンス(2.3)は、対応する1文字の内部表現に置き換えられます。基本ソース文字セット(2.2)にないソースファイル文字は、その文字を指定するユニバーサル文字名に置き換えられます。(実装では、ソースファイルで実際に検出された拡張文字、およびソースファイルでユニバーサル文字名として(つまり、\ uXXXX表記を使用して)表現された同じ拡張文字が処理される限り、任意の内部エンコーディングを使用できます。同等に。)
gccの場合、オプションを使用して変更できます-finput-charset=charset
。さらに、実行時に値を再プリセットするために使用される実行文字を変更できます。このための適切なオプションは-fexec-charset=charset
、char(デフォルトはutf-8
)および-fwide-exec-charset=charset
(デフォルトは、utf-16
またはutf-32
のサイズに応じてwchar_t
)です。