Was ist der Vorteil der Wahl der ASCII-Codierung gegenüber UTF-8?

91

Alle Zeichen in ASCII können mit UTF-8 ohne Speichererweiterung codiert werden (beides erfordert ein Byte Speicherplatz).

UTF-8 bietet den zusätzlichen Vorteil der Zeichenunterstützung über "ASCII-Zeichen" hinaus. Wenn dies der Fall ist, warum wählen wir dann jemals eine ASCII-Codierung anstelle von UTF-8?

Gibt es einen Anwendungsfall, in dem wir ASCII anstelle von UTF-8 wählen?

Pacerier
quelle
9
Um
altes
9
Ich meine , die UTF8 ist legacily ASCII unterstützt auch. Selbst wenn Sie ältere Versionen unterstützen müssen, funktioniert UTF8 einwandfrei, es sind keine weiteren Änderungen erforderlich.
Pacerier
3
Möglicherweise müssen Sie mit einem System zusammenarbeiten, das 8 ASCII-Zeichen in 7 Bytes packt? Die Leute haben verrückte Sachen gemacht, um die Dinge
unterzubringen
4
Nennen Sie mich verrückt, aber ich würde sagen, Sicherheit und Stabilität. Ein Zeichensatz ohne Multibyte-Sequenzen ist viel schwerer zu knacken. Verstehen Sie mich nicht falsch, wenn die Unterstützung der menschlichen Sprache wichtig ist. Aber wenn Sie nur einige grundlegende Programmieraufgaben erledigen und sich in die Muttersprache, für die der Compiler und das Betriebssystem geschrieben wurden, quetschen können, warum sollten Sie dann die Komplexität erhöhen? @Donal Fellows. Zuletzt habe ich überprüft ... ASCII ist 7 Bytes. (alles mit diesem zusätzlichen Bit ist einfach nicht ASCII und bittet um Ärger)
Ebyrob
2
@ebyrob Ich denke, Donal Fellows bedeutet, 8 ASCII-Symbole in 7 Bytes zu packen, da jedes Symbol 7 Bits verwendet ... 8 * 7 = 56 Bits = 7 Bytes. Es würde eine spezielle Codierungs- und Decodierungsfunktion bedeuten, um nur 1 Byte Speicherplatz von jeder 8.
dodgy_coder

Antworten:

83

In einigen Fällen kann der Zugriff auf einzelne Zeichen beschleunigt werden. Stellen Sie sich einen str='ABC'in UTF8 und in ASCII codierten String vor (vorausgesetzt, die Sprache / der Compiler / die Datenbank kennen sich mit Codierung aus).

Um Cmit dem Array-Zugriffsoperator, der in vielen Programmiersprachen verwendet wird, auf das dritte ( ) Zeichen aus dieser Zeichenfolge zuzugreifen, müssen Sie Folgendes tun c = str[2].

Wenn die Zeichenfolge nun ASCII-codiert ist, müssen wir nur das dritte Byte aus der Zeichenfolge abrufen.

Wenn die Zeichenfolge jedoch UTF-8-codiert ist, müssen wir zuerst prüfen, ob das erste Zeichen ein Ein-oder Zwei-Byte-Zeichen ist, und dann müssen wir dieselbe Prüfung für das zweite Zeichen durchführen. Erst dann können wir auf das dritte Zeichen zugreifen. Der Leistungsunterschied ist umso größer, je länger die Saite ist.

Dies ist beispielsweise bei einigen Datenbank-Engines ein Problem, bei denen nach einem UTF-8-codierten VARCHAR ein Spaltenanfang steht und die Datenbank nicht nur überprüfen muss, wie viele Zeichen sich im VARCHAR-Feld befinden, sondern auch, wie Jedes von ihnen verwendet viele Bytes.

Mchl
quelle
3
Wenn die Datenbank nicht sowohl die "Anzahl der Zeichen" als auch die "Anzahl der Bytes" speichert, dann würde ich sagen, dass es einige Probleme gibt ...
Dean Harding
1
TBH Ich kenne keine Datenbank, die entweder speichern würde ...
Mchl
@Mchl: Wie stellst du dir vor, dass die Datenbank weiß, wann sie das Ende der Zeichenkette erreicht hat?
Kevin Cline
1
Normalerweise durch Erreichen von 0x00 oder 0x0000
Mchl
4
@DeanHarding Wie sagt Ihnen die Anzahl der Zeichen, wo das zweite Zeichen beginnt? Oder sollte die Datenbank auch einen Index für jeden Zeichenoffset enthalten? Hinweis: Es handelt sich nicht nur um 2 Zeichen, sondern es können bis zu 4 (außer bei 6) Zeichen verwendet werden . Stackoverflow.com/questions/9533258/… . (Ich denke, nur utf-16 hatte die wirklich langen Greuel, die Ihr System zerstören könnten)
Ebyrob
7

Wenn Sie nur die US-ASCII-Teilmenge (oder ISO 646-Teilmenge) von UTF-8 verwenden, hat die eine oder andere keinen wirklichen Vorteil. in der Tat ist alles identisch codiert.

Wenn Sie über den US-ASCII-Zeichensatz hinausgehen und (zum Beispiel) Zeichen mit Akzenten, Umlauten usw. verwenden, die in typischen westeuropäischen Sprachen verwendet werden, gibt es einen Unterschied - die meisten davon können es immer noch Wird in ISO 8859 mit einem einzigen Byte codiert, erfordert jedoch zwei oder mehr Bytes, wenn es in UTF-8 codiert wird. Es gibt natürlich auch Nachteile: ISO 8859 erfordert , dass Sie einige aus Band verwenden , bedeutet die Codierung angeben , verwendet wird, und es unterstützt nur einvon diesen Sprachen zu einer Zeit. Beispielsweise können Sie alle Zeichen des kyrillischen Alphabets (Russisch, Weißrussisch usw.) mit jeweils nur einem Byte codieren, wenn Sie jedoch französische oder spanische Zeichen (mit Ausnahme der US-ASCII-Zeichen) benötigen / möchten / ISO 646-Teilmenge) Sie haben so ziemlich Pech - Sie müssen die Zeichensätze dafür komplett ändern.

ISO 8859 ist wirklich nur für europäische Alphabete nützlich. Um die meisten der in den meisten chinesischen, japanischen, koreanischen, arabischen usw. Alphabeten verwendeten Alphabete zu unterstützen, müssen Sie eine völlig andere Codierung verwenden. Einige davon (z. B. Shift JIS für Japaner) sind absolut schmerzhaft. Wenn es eine Chance gibt, dass Sie sie jemals unterstützen möchten, würde ich die Verwendung von Unicode für alle Fälle als sinnvoll erachten.

Jerry Sarg
quelle
5

ANSI kann viele Dinge sein, die meisten sind in dieser Hinsicht 8-Bit-Zeichensätze (wie Codepage 1252 unter Windows).

Vielleicht haben Sie an ASCII gedacht, 7-Bit und eine richtige Teilmenge von UTF-8. Dh jeder gültige ASCII-Stream ist auch ein gültiger UTF-8-Stream.

Wenn Sie an 8-Bit-Zeichensätze denken, besteht ein sehr wichtiger Vorteil darin, dass alle darstellbaren Zeichen genau 8-Bit-Zeichen sind, wobei sie in UTF-8 bis zu 24 Bit lang sein können.


quelle
Ja, ich spreche über das 7-Bit-ASCII-Set. Können Sie sich einen Vorteil vorstellen, den wir jemals als ASCII-Datei anstelle von UTF-8 speichern müssen? (Da die 7-Bit-Version sowieso als 8-Bit-Version gespeichert werden würde, wäre die Dateigröße exakt gleich.)
Pacerier
1
Wenn Sie Zeichen haben, die größer als der Unicode-Wert 127 sind, können diese nicht in ASCII gespeichert werden.
1
@Pacerier: Jede ASCII-Zeichenfolge ist eine UTF-8-Zeichenfolge , daher gibt es keinen Unterschied . Die Codierung Routine könnte schneller in Abhängigkeit von der Stringdarstellung der Plattform , die Sie verwenden, obwohl ich nicht signifikante Beschleunigung erwarten würde, während Sie einen erheblichen Verlust an Flexibilität.
back2dos
@Thor das ist genau, warum ich frage, ob das Speichern als ASCII irgendwelche Vorteile hat
Pacerier
5
@Pacerier, wenn Sie XML als ASCII speichern, müssen Sie z. B. & # 160; für einen nicht zerbrechlichen Raum. Dies ist fülliger, macht Ihre Daten jedoch widerstandsfähiger gegen ISO-Latin-1-Codierungsfehler und UTF-8-Codierungsfehler. Dies ist, was wir tun, da unsere zugrunde liegende Plattform eine Menge unsichtbarer Magie mit Charakteren ausführt. Wenn wir in ASCII bleiben, werden unsere Daten robuster.
3

Ja, es gibt immer noch einige Anwendungsfälle, in denen ASCII sinnvoll ist: Dateiformate und Netzwerkprotokolle . Insbesondere für Anwendungen, bei denen:

  • Sie haben Daten, die von Computerprogrammen generiert und verbraucht werden und die Endbenutzern niemals zur Verfügung gestellt werden.
  • Aber was für Programmierer nützlich ist, um lesen zu können, um die Entwicklung und das Debuggen zu vereinfachen.

Indem Sie ASCII als Kodierung verwenden, vermeiden Sie die Komplexität der Mehrbyte-Kodierung, während die Lesbarkeit erhalten bleibt.

Einige Beispiele:

  • HTTP ist ein Netzwerkprotokoll, das in Form von Folgen von Oktetten definiert ist, aber es ist sehr nützlich (zumindest für englischsprachige Programmierer), dass diese der ASCII-Codierung von Wörtern wie "GET", "POST", "Accept-Language" und "HTTP" entsprechen bald.
  • Die Chunk-Typen im PNG-Bildformat bestehen aus vier Oktetten. Es ist jedoch praktisch, wenn Sie einen PNG-Encoder oder -Decoder programmieren, der IDAT"Bilddaten" und PLTE"Palette" bedeutet.

Natürlich müssen Sie darauf achten, dass die Daten den Endbenutzern nicht wirklich angezeigt werden, denn wenn sie sichtbar werden (wie im Fall von URLs), werden die Benutzer dies zu Recht erwarten in einer Sprache, die sie lesen können.

Gareth Rees
quelle
Gut gesagt. Ein bisschen ironisch ist, dass HTTP, das Protokoll, das den meisten Unicode der Welt überträgt, nur ASCII unterstützen muss. (Ich nehme an, dasselbe gilt für TCP und IP, Binärunterstützung, ASCII-Unterstützung ... das ist alles, was Sie auf dieser
Stapelebene
2

Erstens: Ihr Titel verwendet / d ANSI, während Sie sich im Text auf ASCII beziehen. Bitte beachten Sie, dass ANSI nicht gleich ASCII ist. ANSI enthält den ASCII-Satz. Der ASCII-Satz ist jedoch auf die ersten 128 numerischen Werte (0 - 127) beschränkt.

Wenn alle Ihre Daten auf ASCII (7-Bit) beschränkt sind, spielt es keine Rolle, ob Sie UTF-8, ANSI oder ASCII verwenden, da sowohl ANSI als auch UTF-8 den vollständigen ASCII-Satz enthalten. Mit anderen Worten: Die numerischen Werte 0 bis einschließlich 127 stehen für genau dieselben Zeichen in ASCII, ANSI und UTF-8.

Wenn Sie Zeichen außerhalb des ASCII-Satzes benötigen, müssen Sie eine Codierung auswählen. Sie könnten ANSI verwenden, aber dann stoßen Sie auf die Probleme aller verschiedenen Codepages. Erstellen Sie eine Datei auf Maschine A und lesen Sie sie auf Maschine B. Diese kann / wird unter Umständen witzig aussehende Texte erzeugen, wenn diese Maschinen so eingerichtet sind, dass sie unterschiedliche Codepages verwenden. Dies liegt einfach daran, dass der numerische Wert nnn unterschiedliche Zeichen in diesen Codepages darstellt.

Diese "Codepage Hölle" ist der Grund, warum der Unicode-Standard definiert wurde. UTF-8 ist nur eine einzige Kodierung dieses Standards, es gibt noch viel mehr. UTF-16 wird am häufigsten verwendet, da es die native Codierung für Windows ist.

Wenn Sie also etwas unterstützen müssen, das über die 128 Zeichen des ASCII-Satzes hinausgeht, empfehle ich UTF-8 . Auf diese Weise spielt es keine Rolle und Sie müssen sich keine Gedanken darüber machen, mit welcher Codepage Ihre Benutzer ihre Systeme eingerichtet haben.

Marjan Venema
quelle
Wenn ich nicht mehr als 128 Zeichen unterstützen muss, was ist der Vorteil der Wahl der ACSII-Codierung gegenüber der UTF8-Codierung?
Pacerier
Abgesehen davon, dass Sie sich auf diese 128 Zeichen beschränken? Nicht viel. UTF-8 wurde speziell für ASCII und die meisten westlichen Sprachen entwickelt, die "nur" ANSI benötigen. Sie werden feststellen, dass UTF-8 nur eine relativ kleine Anzahl der höheren ANSI-Zeichen mit mehr als einem Byte codiert. Es gibt einen Grund, warum die meisten HTML-Seiten standardmäßig UTF-8 verwenden ...
Marjan Venema
1
@Pacerier, wenn Sie keine Codierung über 127 benötigen, kann die Auswahl von ASCII sinnvoll sein, wenn Sie eine API zum Codieren / Decodieren verwenden, da UTF eine zusätzliche Bitüberprüfung benötigt, um zusätzliche Bytes als dasselbe Zeichen zu berücksichtigen reines ASCII, das gerade 8 Bits ohne Überprüfung liest. Ich empfehle Ihnen jedoch nur, ASCII zu verwenden, wenn Sie wirklich ein hohes Maß an Optimierung für große (große) Berechnungen benötigen und wissen, was Sie in dieser Optimierung tun. Wenn nicht, verwenden Sie einfach UTF-8.
Luciano