C-standard : Zeichensatz und Kodierung Spezifikation
Fand ich den C-standard (C99 und C11) vage mit Bezug auf Zeichen/Zeichenfolge code-Positionen und encoding rules:
Erstens definiert der standard the source character set
und the execution character set
.
Im wesentlichen gibt es eine Reihe von Glyphen, aber nicht zuordnen beliebiger numerischer Werte
mit Ihnen - Also, was ist der Standard-Zeichensatz?
Ich verlange nicht die Kodierung hier aber nur die Glyphe/repertoire, um numerische - /code-Punkt-mapping.
Es tut definieren universal character names
als ISO/IEC 10646, aber es bedeutet, dass
dies ist die Standard-Zeichenkodierung?
Als eine Erweiterung des oben - ich konnte nichts finden, was besagt, welche Zeichen
die numerische escape-Sequenzen \0 und \x stellen.
Aus der C-standards (C99 und C11, die ich nicht überprüfen, ANSI-C) habe ich die folgende
Wissenswertes zu Zeichen-und string-Literale:
+---------+-----+------------+----------------------------------------------+
| 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 |
| u8"..." | C11 | char[] | A UTF-8 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 |
+---------+-----+------------+----------------------------------------------+
Konnte ich aber nicht finden, nichts über das encoding-Regeln für diese Literale.
UTF-8 scheint anzudeuten UTF-8-Codierung, aber ich glaube nicht, dass es explizit erwähnt
überall. Auch für die anderen Arten ist die Codierung undefined oder implementation abhängig?
Ich bin nicht zu vertraut mit die der UNIX-Spezifikation. Nicht die der UNIX-Spezifikation angeben, jede zusätzliche Einschränkung(en) auf diese Regeln?
Auch wenn jemand mir sagen kann, was charset/encoding-Schema verwendet, von GCC und MSVC das würde auch helfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C ist nicht gierig über Zeichensätze. Es gibt keine solche Sache als "default character set", es ist die Umsetzung definiert - obwohl es meist ASCII oder UTF-8 auf den meisten modernen Systemen.
Den standard nicht spezifiziert ein Standard-encoding, weil die bisherige Praxis hatte bereits C implementiert auf Rechnern mit vielen verschiedenen Codierungen, zum Beispiel Honeywell mainframes und IBM-mainframes.
Ich würde erwarten, gcc, um seinen Standard von der Gebietsschema-von LC_CHARSET, aber ich habe noch nie getestet.
VC++ nimmt seinen Standard über ein Bedienfeld einstellen. Das Standard-Control-Panel-Einstellung variiert je nach dem Land, in Windows gekauft wurde, und die meisten Benutzer nie ändern, aber Sie können es ändern, während der Installation von Windows können Sie später noch ändern.
Trigraphs erfunden wurden, so dass eine source-Programm kopiert werden, aus einer Umgebung mit einer Sprache zu einer Umgebung mit einem etwas anderen Schauplatz und noch kompiliert werden. Zum Beispiel, wenn ein Windows-Benutzer in China verwendet trigraphs dann ein Windows-Benutzer, die in Griechenland in der Lage wäre, der zum kompilieren der gleichen source-Programm. Allerdings, wenn die locales sind zu unterschiedlich, zum Beispiel eine mit EBCDIC und eins mit EUC, trigraphs nicht ausreichen.
#define __BACKSLASH_DESIGNATOR
, alle Erscheinungen des Charakters, oder eine Sequenz, die folgt, (muss mindestens ein Zeichen enthalten, die außerhalb der standard-C-set) betrachtet werden würde, als ein umgekehrter Schrägstrich; bei anderen chars könnte dann mit backslash Digraphen.¬
Charakter erforderlich für PL/I, aber da PL/I habe nicht verwenden^
, die ASCII-zu-EBCDIC-übersetzung einfach konvertiert die ASCII -^
dem EBCDIC -¬
. Ich Frage mich, ob der gleiche Ansatz könnte auch gearbeitet haben mit C--erklären, dass jede Umsetzung benennen einen "escape" - Zeichen (das wäre ` für ASCII), und...☃
die Zeichen# [ ] { } | ~ ^
würde gerendert werden als☃= ☃( ☃) ☃< ☃> ☃! ☃- ☃'
? Ich nehme an, aber, meine größte Frage ist, warum trigraphs Arbeit in string-literalen. Wenn ein C-compiler verwendet wird, auf ein terminal, dessen Glyphen für Zeichen 0x7E sieht aus wie→
eher als~
, was würdestprintf("??-");
besser sein, alsprintf("→");
? Ich würde annehmen, dass beide Aussagen für die Ausgabe der→
Charakter.£
Charakter liegt, in beiden PETASCII-sets, auf 0x5B (zwischen[
und]
), die dem ` Leben in ASCII. Interessant ist auch, dass beide PETASCII-sets verwenden, nach oben und nach Links Pfeile für 0x5E und 0x5F, während moderne ASCII verwendet caret-Zeichen und Unterstreichungszeichen. Einige alte ASCII-Geräte verwenden Sie die Pfeile, und ich Frage mich, was führte zu der änderung.