C および C++ 言語では、実装において非常に大きな自由度があります。C は、UTF-8 が「テキストを 1 バイトでエンコードする方法」になるずっと前に書かれました。異なるシステムには異なるテキスト エンコーディングがありました。
したがって、C および C++ の文字列のバイト値は実際にはコンパイラ次第です。 'A'
は、文字 に対してコンパイラが選択したエンコーディングでありA
、UTF-8 と一致しない場合があります。
C++ では、実際の UTF-8 文字列リテラルをコンパイラでサポートする必要があるという要件が追加されました。のビット値はu8"A"[0]
、コンパイラが対象とするプラットフォームの優先エンコーディングに関係なく、UTF-8 標準を通じて C++ 標準によって固定されます。
現在、ほとんどのプラットフォームの C++ ターゲットが 2 の補数の整数を使用しているように、ほとんどのコンパイラには、UTF-8 とほぼ互換性のある文字エンコーディングがあります。したがって、 のような文字列の場合"hello world"
、u8"hello world"
ほぼ確実に同じになります。
具体的な例として、man gcc
-fexec-charset=文字セット
文字列および文字定数に使用される実行文字セットを設定します。デフォルトは UTF-8 です。charset は、システムの iconv ライブラリ ルーチンでサポートされている任意のエンコーディングにすることができます。
-finput-charset=文字セット
入力ファイルの文字セットから GCC が使用するソース文字セットへの変換に使用される入力文字セットを設定します。ロケールが指定されていない場合、または GCC がロケールからこの情報を取得できない場合、デフォルトは UTF-8 です。これは、ロケールまたはこのコマンド ライン オプションでオーバーライドできます。現在、競合がある場合は、コマンド ライン オプションが優先されます。charset は、システムの iconv ライブラリ ルーチンでサポートされている任意のエンコーディングにすることができます。
C/C++ の実行文字セットと入力文字セットを変更できる例です。