Sollte mein Quellcode in UTF-8 sein?

10

Ich habe das Gefühl, dass Sie oft nicht wirklich auswählen, in welchem ​​Format Ihr Code vorliegt. Ich meine, die meisten meiner Tools in der Vergangenheit haben sich für mich entschieden. Oder ich habe nicht wirklich darüber nachgedacht. Ich habe neulich TextPad unter Windows verwendet und als ich eine Datei speicherte, wurde ich über ASCII, UTF-8/16, Unicode usw. usw. informiert.

Ich gehe davon aus, dass fast der gesamte geschriebene Code ASCII ist, aber warum sollte es ASCII sein? Sollten wir jetzt tatsächlich UTF-8-Dateien für den Quellcode verwenden und warum? Ich würde mir vorstellen, dass dies in mehrsprachigen Teams nützlich sein könnte. Gibt es Standards dafür, wie mehrsprachige Teams Variablen / Funktionen / etc benennen?

Parris
quelle
6
Ich schreibe meinen ganzen Code auf Klingonisch, du unempfindlicher Klumpen!
5
@ JackManey: Das ist nicht /. du unempfindlicher Klumpen!
FrustratedWithFormsDesigner
Und das klingonische Skript ist nicht in Unicode enthalten, sodass Sie entweder Zeichen für den privaten Gebrauch oder eine ASCII-Transliteration verwenden müssen.
dan04
@ dan04: Klingonisch hat eine Pseudo-Standard-Nutzung des Teils der privaten Nutzung des BMP (siehe die ConScript-Registrierung ) :-)
Ross Patterson
Siehe auch die Argumente hier: utf8everywhere.org
Rory Hunter

Antworten:

23

Die Wahl liegt nicht zwischen ASCII und UTF-8. ASCII ist eine 7-Bit-Codierung, die von UTF-8 ersetzt wird. Jeder gültige ASCII-Text ist auch für UTF-8 gültig. Die Probleme treten auf, wenn Sie Nicht-ASCII-Zeichen verwenden. Für diese müssen Sie zwischen UTF-8, UTF-16, UTF-32 und verschiedenen 8-Bit-Codierungen (ISO-xxxx usw.) wählen.

Die beste Lösung besteht darin, sich an einen strengen ASCII-Zeichensatz zu halten, dh keine Nicht-ASCII-Zeichen in Ihrem Code zu verwenden. Die meisten Programmiersprachen bieten Möglichkeiten, Nicht-ASCII-Zeichen mit ASCII-Zeichen auszudrücken, z. B. "\u1234"um den Unicode-Codepunkt bei 1234 anzugeben. Vermeiden Sie insbesondere die Verwendung von Nicht-ASCII-Zeichen für Bezeichner. Selbst wenn sie richtig funktionieren, werden Sie von Personen, die ein anderes Tastaturlayout verwenden, dafür verflucht, dass sie diese Zeichen eingeben.

Wenn Sie Nicht-ASCII-Zeichen nicht vermeiden können, ist UTF-8 die beste Wahl. Im Gegensatz zu UTF-16 und UTF-32 handelt es sich um eine Obermenge von ASCII, was bedeutet, dass jeder, der es mit der falschen Codierung öffnet, zumindest das meiste davon richtig macht. Im Gegensatz zu 8-Bit-Codepages kann es eindeutig jedes Zeichen codieren, das Sie jemals benötigen werden, und es ist auf jedem System verfügbar, unabhängig vom Gebietsschema.

Und dann haben Sie die Codierung, die Ihr Code verarbeitet. Dies muss nicht mit der Codierung Ihrer Quelldatei identisch sein. Zum Beispiel kann ich PHP leicht in UTF-8 schreiben, aber seine interne Multibyte-Codierung auf beispielsweise Latin-1 setzen; Da sich der PHP-Parser überhaupt nicht mit Codierungen befasst, sondern nur Byte-Sequenzen liest, werden meine UTF-8-String-Literale als Latin-1 falsch interpretiert. Wenn ich diese Zeichenfolgen auf einem UTF-8-Terminal ausgebe, werden keine Unterschiede angezeigt, aber Zeichenfolgenlängen und andere Multibyte-Operationen (z. B. substr) führen zu falschen Ergebnissen.

Meine Faustregel lautet, UTF-8 für alles zu verwenden. Nur wenn Sie sich unbedingt mit anderen Codierungen befassen müssen, konvertieren Sie so früh wie möglich zu UTF-8 und so spät wie möglich von UTF-8.

tdammers
quelle
6

Die meisten IDEs speichern standardmäßig mit UTF-8-Codierung, und Sie sollten mit ziemlicher Sicherheit UTF-8 anstelle von ASCII wählen, wenn Sie die Option erhalten. Dies stellt sicher, dass Sie nicht auf seltsame Probleme mit dem Internationalisierungscode stoßen.

Oleksi
quelle
2
Sie lassen es so aussehen, als wäre ASCII vs. UTF-8 eine Wahl. Wenn eine Datei Nicht-ASCII-Zeichen enthält, ist dies nicht der Fall. Wenn es nur ASCII - Zeichen sind, UTF-8 ist ASCII.
Fred Foo
Ich wünschte, Eclipse würde daran festhalten. Als CS-Student im ersten Jahr hat mein Gott viele Kopfschmerzen verursacht, wenn er in Gruppen arbeitet, in denen OS X-, Windows- und Linux-Benutzer anwesend sind. (Als Referenz ist es standardmäßig MacRoman unter OS X, CP-1252 unter Windows und ich habe vergessen, welches unter Linux, aber Sie wetten, es ist ein anderes.)
Leflings
@leflings - wahrscheinlich eine Standardumgebungscodierung, die derzeit normalerweise UTF-8 ist.
Maciej Piechotka
1

Es ist sehr schön, einfachen Text in Anführungszeichen oder Zeichen im Quellcode eingeben zu können und das tatsächliche Zeichen zu sehen. Zum Beispiel sind das pi-Symbol 'π' oder das Ideogramm '𠀊' viel schöner als das Äquivalent '\ u3c0' für pi und L '\ u2000A' für das Ideogramm.

Es ist möglich, diese Zeichen wie ASCII-Zeichen in einem anständigen Editor direkt in den Quellcode einzugeben und / oder zu kopieren und einzufügen.

Ich finde konkrete Beispiele hilfreich, um Dinge zu konzipieren und zu verstehen, die Wortbeschreibungen manchmal nicht nach Hause zu bringen scheinen. Konzeptualisieren Sie in den Quellcode eingegebene Unicode-Zeichenkonstanten, z. B. das folgende kurze Beispielcode-Snippet:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

Das ASCII-Tilde-Zeichen '~' kann in einer ASCII- oder UTF-8-Quelldatei gespeichert werden, die Unicode-Zeichen können jedoch nicht in ASCII-Form gespeichert werden. Das PI-Symbol 'π' ist der Unicode-Codepunkt 0x3c0 und kann in UTF-8-Form als Zwei-Byte-Wert 0xcf, 0x80 gespeichert werden. Die Ideogramme an den Unicode-Codepunkten 0x2000a und 0x2893d erfordern 4-Byte-UTF-8-Sequenzen.

Damit diese Zeichen ihre beabsichtigten Werte beibehalten und der Compiler sie wie beabsichtigt interpretieren kann, muss der Quellcode in einem Format gespeichert werden, das den Unicode-Zeichensatz unterstützt, z. B. UTF-8 oder UTF-16. Wenn es als UTF-8 gespeichert wird, versteht und interpretiert ein anständiger Compiler die Werte wie beabsichtigt, und ein anständiger Editor lädt die Zeichen und zeigt sie ordnungsgemäß an.

Wie andere bereits betont haben, führt das Speichern als UTF-8 zu einer Datei, die sich nicht vom Speichern einer ASCII-Datei unterscheidet, da UTF- 8 ist so konzipiert, dass ASCII im ASCII-Zeichenbereich überlappt. Sobald Sie ein Zeichen in Ihren Quellcode eingeben, das außerhalb des ASCII-Bereichs liegt, werden Sie von einem anständigen Editor darüber informiert, dass Sie eine Codierung auswählen müssen, die zum Speichern der Datei verwendet werden soll. UTF-8 ist eine gute Wahl, da es ASCII unverändert verarbeiten kann und praktisch jedes andere Zeichen in Ihrer Entwicklungsumgebung unterstützt wird.

Dan Hagler
quelle