7

encoding-prefix で始まらない文字列リテラルは通常の文字列リテラルであり、指定された文字で初期化されます。

u8"asdf" などの u8 で始まる文字列リテラルは UTF-8 文字列リテラルであり、UTF-8 でエンコードされた特定の文字で初期化されます。

通常の文字列リテラルと UTF-8 文字列リテラルの違いがわかりません。

誰かが異なる状況の例を提供できますか? (異なるコンパイラ出力を引き起こします)

(特定の実装ではなく、標準のPOVから意味します)

文字リテラルまたは文字列リテラルの各ソース文字セット メンバー、および文字リテラルまたは非生文字列リテラルの各エスケープ シーケンスおよびユニバーサル文字名は、実行文字セットの対応するメンバーに変換されます。

4

1 に答える 1

7

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++ の実行文字セットと入力文字セットを変更できる例です。

于 2013-02-04T03:06:19.073 に答える