次の文に注意してください。
物理的なソース ファイルの文字は、必要に応じて実装定義の方法で基本的なソース文字セットにマップされます (行末インジケーターに改行文字を導入します)。
つまり、ファイルを構成する文字またはバイトを実際にどのように解釈するかは、完全にコンパイラ次第です。この解釈を行う際に、基本的なソース文字セットに属する物理文字とそうでない文字を決定する必要があります。キャラクターが属していない場合、それはユニバーサル キャラクター名に置き換えられます (または、少なくとも、あたかもそうであったかのような効果があります)。
これのポイントは、ソース ファイルを非常に小さな文字セットに減らすことです。基本的なソース文字セットには 96 文字しかありません。基本的なソース文字セットに含まれていない文字は、\
、u
またはU
、および一部の 16 進数 ( 0
- F
) に置き換えられています。
ユニバーサル キャラクター名は、次のいずれかです。
\uNNNN
\UNNNNNNNN
それぞれN
が 16 進数です。これらの数字の意味は、§2.3 に記載されています。
ユニバーサル文字名で指定される文字\UNNNNNNNN
は、ISO/IEC 10646 での文字の短縮名がNNNNNNNN
;である文字です。ユニバーサル文字名で指定された文字\uNNNN
は、ISO/IEC 10646 の文字短縮名が である文字です0000NNNN
。ユニバーサル文字名の 16 進値がサロゲート コード ポイント ( 0xD800
-<code>0xDFFF の範囲内) に対応する場合、プログラムは不正な形式です。
ISO/IEC 10646 標準は Unicode の前に作成され、ユニバーサル文字セット (UCS) を定義しました。コードポイントを文字に割り当て、それらのコードポイントをエンコードする方法を指定しました。その後、Unicode コンソーシアムと ISO グループが力を合わせて Unicode に取り組みました。Unicode 規格は、ISO/IEC 10646 よりもはるかに多く (アルゴリズム、機能文字の仕様など) を規定していますが、現在、両方の規格が同期しています。
NNNN
したがって、またはNNNNNNNN
は、その文字の Unicode コード ポイントと考えることができます。
例として、これを含むソース ファイルの行を考えてみます。
const char* str = "Hellô";
ô は基本的なソース文字セットに含まれていないため、その行は内部的に次のように変換されます。
const char* str = "Hell\u00F4";
これにより、同じ結果が得られます。
ユニバーサル文字名が許可されるのは、コードの特定の部分だけです。