C18標準の矛盾(文字セットに関して)?
C18標準で読みました:
5.1.1.2翻訳フェーズ
翻訳の構文規則間の優先順位は、次のフェーズで指定されます。
- 物理ソースファイルのマルチバイト文字は、実装で定義された方法で、必要に応じてソース文字セットにマップされます(行末インジケーターに改行文字が導入されます)。
ソースファイルの文字セットがデコードされ、ソース文字セットにマップされることを意味します。
しかし、あなたは読むことができます:
5.2.1文字セット
2つの文字セットとそれに関連する照合シーケンスを定義する必要があります。ソースファイルが書き込まれるセット(ソース文字セット)と、実行環境で解釈されるセット(実行文字セット)です。
ソースファイルの文字セットがソース文字セットであることを意味します。
だから問題は、私が間違って理解したのはどれか、それとも実際に間違っているのかということです。
編集:実際には私は間違っていました。以下の私の答えを参照してください。
回答
ソースファイルの文字セットがデコードされ、ソース文字セットにマップされることを意味します。
いいえ、それはそれを意味するものではありません。私の考えでは、ソースはすでにソース文字セットで記述されていると想定されています-「ソース文字セットをソース文字セットにマップする」ことはどの程度正確に意味がありますか?それらはセットの一部であるか、そうでないかのどちらかです。ソースコードに間違ったエンコーディングを選択すると、前処理が開始される前に拒否されます。
翻訳フェーズ1は、これとはまったく関係のない2つのことを行います。
標準化されたマルチバイトシーケンスであるトリグラフを解決します。
マルチバイト文字をソース文字セット(5.2.1で定義)にマップします。
ソース文字セットは、基本的にラテンアルファベットとさまざまな一般的な記号(5.2.1 / 3)である基本文字セットと、ロケールおよび実装に固有の拡張文字セットで構成されます。
マルチバイト文字の定義は5.2.1.2にあります。
ソース文字セットには、拡張文字セットのメンバーを表すために使用されるマルチバイト文字が含まれる場合があります。実行文字セットには、ソース文字セットと同じエンコーディングである必要のないマルチバイト文字を含めることもできます。
ロケール固有のトリグラフなど、さまざまなロケール固有の奇妙な特殊なケースを意味します。
このマルチバイトの狂気はすべて、1990年の最初の標準化にまでさかのぼります。その委員会のメンバーからの逸話によると、これは、ヨーロッパのさまざまな国のメンバーが各国のキーボードでさまざまな記号を使用できなかったためです。
(当時、そのようなキーボードのAltGrキーがどれほど普及していたかはわかりません。英語以外のキーボードでCを書くときに、{}[]
記号などにアクセスするために、深刻なボタンマッシングの対象となるキーのままです。)
まあ、結局私は間違っていたようです。WG14グループ(彼らはC標準を担当しています)のDavid Keatonに連絡した後、私は次の明確な回答を得ました。
微妙な違いがあります。ソース文字セットは、ソースファイルが書き込まれる文字セットです。ただし、ソース文字セットは使用可能な文字のリストにすぎず、エンコーディングについては何も述べていません。
フェーズ1は、ソース文字セットのマルチバイトエンコーディングを抽象ソース文字自体にマップします。
言い換えれば、次のようなキャラクター:
<バイト1> <バイト2>
これにマップされます:
<キャラクター1>
1つ目は、プログラムが作成されたソース文字セットの文字を表すエンコーディングです。2つ目は、ソース文字セットの抽象文字です。