文字/文字列コードの位置とエンコード規則に関して、C 標準 (C99 および C11) が曖昧であることがわかりました。
まず、規格ではthe source character set
とが定義されてthe execution character set
います。基本的に、グリフのセットを提供しますが、それらに数値を関連付けることはありません。では、デフォルトの文字セットは何ですか?
ここでエンコーディングについて質問しているわけではなく、グリフ/レパートリーから数値/コード ポイントへのマッピングについて質問しています。ISO/IEC 10646 として定義universal character names
されていますが、これがデフォルトの文字セットであると言っていますか?
上記の拡張として、数値エスケープ シーケンス \0 および \x が表す文字を示すものは何も見つかりませんでした。
C 標準 (C99 および C11、ANSI C はチェックしませんでした) から、文字および文字列リテラルについて次のことがわかりました。
+---------+-----+------------+----------------------------------------------+
| Literal | Std | Type | Meaning |
+---------+-----+------------+----------------------------------------------+
| '...' | C99 | int | An integer character constant is a sequence |
| | | | of one or more multibyte characters |
| L'...' | C99 | wchar_t | A wide character constant is a sequence of |
| | | | one or more multibyte characters |
| u'...' | C11 | char16_t | A wide character constant is a sequence of |
| | | | one or more multibyte characters |
| U'...' | C11 | char32_t | A wide character constant is a sequence of |
| | | | one or more multibyte characters |
| "..." | C99 | char[] | A character string literal is a sequence of |
| | | | zero or more multibyte characters |
| L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero |
| | | | or more multibyte characters |
| u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero |
| | | | or more multibyte characters |
| U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero |
| | | | or more multibyte characters |
| u8"..." | C11 | char[] | A UTF-8 string literal is a sequence of zero |
| | | | or more multibyte characters |
+---------+-----+------------+----------------------------------------------+
ただし、これらのリテラルのエンコード規則については何も見つかりませんでした。 UTF-8 は UTF-8 エンコーディングを示唆しているように見えますが、どこにも明示的に言及されているとは思いません。また、他のタイプの場合、エンコーディングは未定義ですか、それとも実装に依存しますか?
私は UNIX の仕様に詳しくありません。UNIX 仕様では、これらの規則に追加の制約が指定されていますか?
また、GCC と MSVC で使用されている文字セット/エンコード方式を誰かが教えてくれれば、それも役に立ちます。