2016-10-17 2 views
1

Erfordert der C-Standard, dass Compiler mit Dateien umgehen können, die nicht als ASCII codiert sind? Insbesondere frage ich mich, ob utf-8-Dateien standardkonform sind. Unterscheidet sich die Antwort auf die vorherige Frage zwischen C89, C99 und C11?Unicode-Zeichen in C

Angenommen, es ist legal, Zeichen außerhalb von ASCII in C-Quelldateien zu verwenden, welche Verwendungen sind zulässig?

ich von ein paar verschiedene Anwendungsfälle denken kann:

  1. innerhalb von Kommentaren
  2. Innerhalb Strings
  3. Innerhalb Identifikatoren
  4. Innerhalb Makronamen

Hier ist ein Beispiel alle zeigen vier:

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

Wenn C zulässt, dass Nicht-ASCII-Zeichen in den oben aufgeführten Verwendungen erscheinen, gibt es irgendwelche Einschränkungen für die Codepunkte, die verwendet werden können?

Denken Sie daran, dass dies eine Frage zu C-Standards ist. Ich bin mir bereits darüber im Klaren, dass die Verwendung von Unicode-Zeichen in Bezeichnern und Makros die Verwendung des Codes erschweren wird.

Antwort

3

Es ist die Implementierung definiert und somit nicht durch den Standard geregelt.

Ich kenne mindestens einen Compiler, nämlich clang, der die Quelle UTF-8 erfordert. Andere Compiler verwenden jedoch möglicherweise andere Anforderungen oder lassen dies nicht zu.

Seit C99 dürfen Bezeichner Multibyte-Zeichen enthalten, aber vor C99 wäre es eine Erweiterung, um nicht-grundlegende Zeichen dort zuzulassen. C11 erweiterte die Menge der erlaubten Zeichen.

Es gibt einige zusätzliche Einschränkungen für die erlaubten Zeichen in Bezeichnern und © ist nicht in der Liste. Es ist in Anhang D aufgeführt. Dies sind Unicode-Punkte, aber das bedeutet nicht unbedingt, dass die Codierung in der Datei Unicode-basiert sein muss.

Zeichenbereiche erlaubt

  • 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

Bereiche Zeichen, die anfänglich nicht zulässig sind

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