簡體   English   中英

C中的Unicode字符

[英]Unicode characters in C

C標准是否要求編譯器能夠處理未編碼為ascii的文件? 特別是,我想知道utf-8文件是否符合標准。 上一個問題的答案在C89,C99和C11之間是否有所不同?

假設在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字符放入標識符和宏將使代碼更難以使用。

它的實現是定義的,因此不受標准的約束。

我知道至少有一個編譯器,即clang ,它要求源是UTF-8。 但是其他編譯器可能會使用其他要求,或者不允許它。

從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM