Was ist der Unterschied zwischen UTF-8 und ISO-8859-1 ?
Was ist der Unterschied zwischen UTF-8 und ISO-8859-1 ?
Antworten:
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.
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.
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 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.
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'
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).
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.
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.