Was ist der Unterschied zwischen UTF-8 und ISO-8859-1?

Antworten:

321

UTF-8 ist eine Multibyte-Codierung, die jedes Unicode-Zeichen darstellen kann. ISO 8859-1 ist eine Einzelbyte-Codierung, die die ersten 256 Unicode-Zeichen darstellen kann. Beide codieren ASCII genauso.

Ignacio Vazquez-Abrams
quelle
11
Beachten Sie, dass ASCII nur von 0 bis 127 reicht. Das MSB ist immer 0.
Hritik
3
Wenn Codepunkte über 127 definiert sind, ist das Codierungssystem eine Version von Extended ASCII.
Rohan Bhale
1
@RohanBhale Verwenden Sie nicht den Ausdruck Extended ASCII; es wird nur Verwirrung stiften.
Herr Lister
Aber erweiterte ASCII könnten der richtige Begriff sein. Ich habe es auf mehreren Ressourcen gelesen
Rohan Bhale
135

Wikipedia erklärt beide ziemlich gut: UTF-8 gegen Latin-1 (ISO-8859-1). Ersteres ist eine Codierung mit variabler Länge, letzteres eine Einzelbyte-Codierung mit fester Länge. Latin-1 codiert nur die ersten 256 Codepunkte des Unicode-Zeichensatzes, während UTF-8 zum Codieren aller Codepunkte verwendet werden kann. Auf der Ebene der physischen Codierung werden nur die Codepunkte 0 bis 127 identisch codiert. Die Codepunkte 128 - 255 unterscheiden sich dadurch, dass sie mit UTF-8 zu einer 2-Byte-Sequenz werden, während sie mit Latin-1 Einzelbytes sind.

StaxMan
quelle
@mu vielleicht war meine Aussage mehrdeutig, aber sie ist nicht falsch - ich habe nicht über codierte Byte-Sequenzen gesprochen, sondern über Zeichensätze, die codiert werden; Dies bedeutet, dass ISO-8859-1 verwendet wird, um die ersten 256 Codepunkte des Unicode-Zeichensatzes zu codieren.
StaxMan
Ihre Klarstellung funktioniert für mich und "mehrdeutig" wäre eine bessere Wortwahl gewesen als "falsch".
Mu ist zu kurz
83

UTF

UTF ist eine Familie von Multi-Byte-Codierungsschemata, die Unicode- Codepunkte darstellen können, die für bis zu 2 ^ 31 [ungefähr 2 Milliarden] Zeichen repräsentativ sein können. UTF-8 ist ein flexibles Codierungssystem, das zwischen 1 und 4 Byte verwendet, um die ersten 2 ^ 21 [ungefähr 2 Millionen] Codepunkte darzustellen.

Lange Rede, kurzer Sinn: Jedes Zeichen mit einer Codepunkt- / Ordnungsdarstellung unter 127, auch bekannt als 7-Bit-sicheres ASCII, wird durch dieselbe 1-Byte-Sequenz wie die meisten anderen Einzelbyte-Codierungen dargestellt. Jedes Zeichen mit einem Codepunkt über 127 wird durch eine Folge von zwei oder mehr Bytes dargestellt, wobei die Einzelheiten der Codierung hier am besten erläutert werden .

ISO-8859

ISO-8859 ist eine Familie von Single-Byte - Codierschemata verwendet Alphabete repräsentieren, die im Bereich von 127 bis 255. Diese verschiedenen Alphabeten dargestellt werden können , werden definiert als „Teile“ in dem Format ISO-8859- n , die bekanntesten Dies sind wahrscheinlich ISO-8859-1, auch bekannt als "Latin-1". Wie bei UTF-8 bleibt 7-Bit-sicheres ASCII unabhängig von der verwendeten Codierungsfamilie unberührt.

Der Nachteil dieses Codierungsschemas ist seine Unfähigkeit, Sprachen mit mehr als 128 Symbolen aufzunehmen oder mehr als eine Familie von Symbolen gleichzeitig sicher anzuzeigen. Auch ISO-8859-Codierungen sind mit dem Aufstieg von UTF in Ungnade gefallen. Die dafür zuständige ISO-Arbeitsgruppe hat sich 2004 aufgelöst und die Wartung ihrem übergeordneten Unterausschuss überlassen.

Sammitch
quelle
1
+1 für die Beantwortung der Frage, aber darüber hinaus und für Informationen zu verwandten Codierungen. Betreff : Codepunkte für UTF-8 Laut stackoverflow.com/a/38488358/3353984 unterstützt UTF-8 2 ^ 21 Codepunkte. Ist das ein Fehler oder könnte hier eine Korrektur erforderlich sein?
Tom Loredo
1
Unicode besteht aus 17 Ebenen mit 2 ^ 16 Codepunkten. 0x00_0000 bis 0x1F_FFFF. Die 17 Flugzeuge können 1.114.112 Codepunkte aufnehmen. Davon sind 2.048 Ersatzzeichen, 66 Nichtzeichen und 137.468 sind für den privaten Gebrauch reserviert, so dass 974.530 für öffentliche Aufträge übrig bleiben. Etwa 1 Million. Siehe Wie viele Zeichen kann UTF-8 codieren? .
Georgeawg
22
  • ASCII: 7 Bits. 128 Codepunkte.

  • ISO-8859-1: 8 Bit. 256 Codepunkte.

  • UTF-8: 8-32 Bits (1-4 Bytes). 1.112.064 Codepunkte.

Sowohl ISO-8859-1 als auch UTF-8 sind abwärtskompatibel mit ASCII, aber UTF-8 ist nicht abwärtskompatibel mit ISO-8859-1:

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

Ausgabe:

©
b'\xc2\xa9'
b'\xa9'
Cyker
quelle
21

ISO-8859-1 ist ein Legacy-Standard aus den 1980er Jahren. Es kann nur 256 Zeichen darstellen und ist daher nur für einige Sprachen in der westlichen Welt geeignet. Selbst für viele unterstützte Sprachen fehlen einige Zeichen. Wenn Sie eine Textdatei in dieser Codierung erstellen und versuchen, einige chinesische Zeichen zu kopieren / einzufügen, werden Sie seltsame Ergebnisse sehen. Mit anderen Worten, benutze es nicht. Unicode hat die Welt erobert und UTF-8 ist heutzutage so ziemlich der Standard, es sei denn, Sie haben einige alte Gründe (wie HTTP-Header, die mit allem kompatibel sein müssen).

Shital Shah
quelle
1
Ich hatte gesehen, wo Umlauts nicht mit UTF8 konvertiert werden sollen. Wir haben Beispiele dafür gesehen und bei der Suche haben wir die ISO-8859-1 gefunden und es scheint zu funktionieren. Wir haben viele deutsche Wissenschaftler, mit denen wir zusammenarbeiten.
Aggie Jon von 87
4
Umlauts werden in utf8 als zwei Zeichen dargestellt. Sie konvertieren gut und funktionieren gut. Das Problem kommt von Programmen, die 1 Byte pro Zeichen erwarten. Für diese Legacy-Programme verfügt ISO-8859-1 über 1-Byte-Umlaute.
Erik Aronesty
3

Aus einer anderen Perspektive 0xc0scheinen Dateien, die sowohl Unicode- als auch ASCII-Codierungen nicht lesen können, weil sie ein Byte enthalten , von ISO-8859-1 richtig gelesen zu werden. Die Einschränkung ist, dass die Datei natürlich keine Unicode-Zeichen enthalten sollte.

Nikhil VJ
quelle
2

Eine weitere wichtige Sache zu beachten: Wenn Sie sehen iso-8859-1, bezieht es sich wahrscheinlich eher auf Windows-1252 als auf ISO / IEC 8859-1 . Sie unterscheiden sich im Bereich 0x80–0x9F, wobei ISO 8859-1 die C1-Steuercodes enthält und Windows-1252 stattdessen nützliche sichtbare Zeichen enthält.

Beispielsweise hat ISO 8859-1 0x85 als Steuerzeichen (in Unicode U + 0085, ``), während Windows-1252 eine horizontale Ellipse hat (in Unicode U + 2026 HORIZONTAL ELLIPSIS ).

Die WHATWG-Codierungsspezifikation (wie sie von HTML verwendet wird) erklärt ausdrücklich iso-8859-1, dass sie eine Bezeichnung für ist windows-1252, und Webbrowser unterstützen ISO 8859-1 in keiner Weise: Die HTML-Spezifikation besagt, dass alle Codierungen in der Codierungsspezifikation unterstützt werden müssen und nicht mehr .

Von Interesse ist auch, dass numerische HTML-Zeichenreferenzen Windows-1252 im Wesentlichen für 8-Bit-Werte anstelle von Unicode-Codepunkten verwenden. pro https://html.spec.whatwg.org/#numeric-character-reference-end-state , …wird U + 2026 statt U + 0085 produzieren.

Chris Morgan
quelle
Hoppla! Ich dachte, ich hätte das geschrieben, aber ich habe es durch ein Umschreiben verloren. Ich habe es jetzt eingegeben.
Chris Morgan
0

Mein Grund für die Untersuchung dieser Frage war aus der Perspektive, inwiefern sie kompatibel sind. Der Latin1-Zeichensatz (iso-8859) ist zu 100% kompatibel und kann in einem utf8-Datenspeicher gespeichert werden. Alle ASCII- und Extended-ASCII-Zeichen werden als Einzelbyte gespeichert.

Wenn Sie in die andere Richtung gehen, kann der Zeichensatz von utf8 zu Latin1 funktionieren oder auch nicht. Wenn 2-Byte-Zeichen vorhanden sind (Zeichen jenseits von Extended-ASCII 255), werden diese nicht in einem Latin1-Datenspeicher gespeichert.

Alan Jürgensen
quelle
2
Hilfreich, aber ich denke, Sie meinten 127 statt 255 in Extended-ASCII 255?
Hydroper
18
Latin-1 oder iso-8859-1 ist nicht 100% kompatibel, um in utf8 gespeichert zu werden. Ein lateinisches-n- oder iso-8859-n-Zeichen über 127 wird nicht in ein einzelnes Byte-utf-8-Zeichen übersetzt. Für die Werte 1-127 werden sie jedoch genau übersetzt.
Marlin Pierce
4
Diese Antwort ist etwas verwirrend in der Verwendung des Begriffs "Extended ASCII", der sich nur auf eine Zeichenkodierung bezieht, die nicht ASCII ist. UTF-8 und Latin-1 sind Beispiele für Extended-ASCII-Codierungen. Nicht-ASCII-Latin-1-Zeichen (dh Codepunkte über 127) können in UTF-8 jedoch nicht als einzelnes Byte codiert werden.
Rdb