13

文字/文字列コードの位置とエンコード規則に関して、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 で使用されている文字セット/エンコード方式を誰かが教えてくれれば、それも役に立ちます。

4

2 に答える 2

6

C は文字セットに貪欲ではありません。「デフォルトの文字セット」のようなものはありません。実装で定義されていますが、ほとんどの最新システムではほとんどが ASCII または UTF-8 です。

于 2012-08-30T19:58:38.097 に答える
4

Honeywell メインフレームや IBM メインフレームなど、多くの異なるエンコーディングを備えたマシンに C が既に実装されているため、標準ではデフォルトのエンコーディングは指定されていません。

gcc は、現在 LC_CHARSET で指定されているロケールからデフォルトを取得することを期待していますが、テストしたことはありません。

VC++ は、コントロール パネルの設定からデフォルトを取得します。そのデフォルトのコントロール パネル設定は、Windows が購入された国によって異なり、ほとんどのユーザーは決して変更しませんが、Windows のインストール中に変更することができ、後で変更することができます。

Trigraph は、あるロケールの環境からわずかに異なるロケールの環境にソース プログラムをコピーしてもコンパイルできるようにするために考案されました。たとえば、中国の Windows ユーザーがトライグラフを使用している場合、ギリシャの Windows ユーザーは同じソース プログラムをコンパイルできます。ただし、ロケールが大きく異なる場合 (たとえば、EBCDIC を使用するものと EUC を使用するもの) では、trigraph では十分ではありません。

于 2012-08-31T02:29:20.190 に答える