2016-10-17 12 views
1

Cの標準では、コンパイラはasciiとしてエンコードされていないファイルを処理できることを要求していますか?特に、utf-8ファイルが標準に準拠しているかどうかは疑問です。前の質問に対する回答はC89、C99、C11の間で異なりますか?CのUnicode文字

CソースファイルでASCII以外の文字を使用することは合法であると仮定しますが、その使用法は合法ですか?

私はいくつかの明確なユースケースと考えることができます:

  1. ここではマクロ名以内識別子
  2. 内の文字列
  3. 内のコメント

内のすべてを示す例です。 4:

#ifdef PRINT_© 
// Print out the © notice 
cont char my©Notice[] = "This program is © 2016 ACME INC"; 
puts(my©Notice); 
#endif 

C言語で上記の用途に非ASCII文字を使用できる場合は、使用できるコードポイントに制限はありますか?

これはCの標準に関する質問です。私は既に、Unicode文字を識別子とマクロに入れるとコードを使いにくくすることに気付きました。

答えて

3

実装は定義されているため、標準によって規制されていません。

ソースがUTF-8であることが必要な少なくとも1つのコンパイラ、つまりclangがあります。しかし、他のコンパイラは、他の要件を使用するか、許さないかもしれません。

C99以降、識別子にはマルチバイト文字を含めることができますが、C99の前には非基本文字を許可する拡張機能になります。 C11は許可された文字のセットを拡張しました。

識別子に使用できる文字にはいくつかの制限がありますが、リストにはありません。付録Dにリストされています。これらはUnicodeポイントですが、ファイル内のエンコーディングがUnicodeベースであることを厳密には意味しません。文字の

範囲は

  • 00A8、00AA、00AD、00AF、00B2-00B5、00B7-00BA、00BC-00BE、00C0-00D6、00D8-00F6、00F8-00FF
  • を許さ0100-167F、1681-180D、180F-1FFF
  • 200B-200D、202A-202E、203F-2040、2054、2060-206F
  • 2070-218F、2460-24FF、2776年から2793年、2C00-2DFF、 2E80-2FFF
  • 3004 3007、3021-302F、3031-303F
  • 3040-D7FF
  • F900-FD3D、FD40-FDCF、FDF0-FE44、FE47-FFFD
  • 10000-1FFFD、20000-2FFFD、30000-3FFFD、40000- 4FFFD、50000-5FFFD、60000-6FFFD、70000-7FFFD、80000-8FFFD、90000-9FFFD、A0000-AFFFD、B0000-BFFFD、C0000-CFFFD、D0000-DFFFD、E0000-EFFFD

の範囲文字は最初に許可されません

  • 0300-036F、1DC0-1DFF、20D0-20FF、FE20-FE2F