Unicode, Unicode Big Endian oder UTF-8? Was ist der Unterschied? Welches Format ist besser?

19

Wenn ich versuche, eine Textdatei mit nicht englischem Text im Editor zu speichern , kann ich zwischen Unicode , Unicode Big Endian und UTF-8 wählen . Was ist der Unterschied zwischen diesen Formaten?

Unter der Annahme , ich nicht jede Abwärtskompatibilität will (mit älteren OS - Versionen oder Apps) und ich nicht kümmere sich um die Dateigröße, die diese Formate sind besser?

(Angenommen, der Text kann neben anderen Sprachen auch in Sprachen wie Chinesisch oder Japanisch verfasst sein.)

Hinweis: Aus den nachstehenden Antworten und Kommentaren geht hervor, dass Unicode in Notepad-Jargon UTF-16 (Little Endian), Unicode-Big-Endian UTF-16 (Big Endian) und UTF-8 UTF-8 ist.

Ashwin Nanjappa
quelle

Antworten:

19

Keine Ahnung. Was ist besser: eine Säge oder ein Hammer? :-)

Unicode ist nicht UTF

In dem Artikel gibt es ein Stück, das für das jeweilige Thema etwas relevanter ist:

  • UTF-8 konzentriert sich auf die Minimierung der Bytegröße für die Darstellung von Zeichen aus dem ASCII-Satz (Darstellung mit variabler Länge: Jedes Zeichen wird mit 1 bis 4 Byte dargestellt, und ASCII-Zeichen passen alle auf 1 Byte). Wie Joel es ausdrückt:

"Schau dir all diese Nullen an!", Sagten sie, da sie Amerikaner waren und englischen Text betrachteten, der selten Codepunkte über U + 00FF verwendete. Auch sie waren liberale Hippies in Kalifornien, die (höhnisch) konservieren wollten. Wenn sie Texaner wären, hätten sie nichts dagegen gehabt, doppelt so viele Bytes zu verschlingen. Aber diese kalifornischen Weicheier konnten es nicht ertragen, den Speicherbedarf für Saiten zu verdoppeln

  • UTF-32 konzentriert sich auf Vollständigkeit und Darstellung mit fester Länge, wobei 4 Bytes für alle Zeichen verwendet werden. Es ist die einfachste Übersetzung und ordnet den Unicode-Codepunkt direkt 4 Bytes zu. Offensichtlich ist es nicht sehr größeneffizient.

  • UTF-16 ist ein Kompromiss, bei dem die meiste Zeit 2 Bytes verwendet werden, der jedoch auf 2 * 2 Bytes pro Zeichen erweitert wird, um bestimmte Zeichen darzustellen, die nicht in der mehrsprachigen Grundebene (Basic Multilingual Plane, BMP) enthalten sind.

Siehe auch Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!)

Jason Baker
quelle
4
Das Problem ergibt sich aus der Tatsache, dass Unicode eine "Kodierung" ist, jedoch nicht im Sinne von Zahlen in Bytes. UTF-8/16/32 sind alle Unicode-Codierungen, Unicode selbst ist jedoch eine Zuordnung von Symbolen zu Zahlen. Sie hätten eine einzigartigere Terminologie verwenden können, um diese Verwirrung zu vermeiden, denke ich.
Jerryjvl
4
Ungeachtet dessen ist die Wahrscheinlichkeit hoch, dass die Anwendung "UTF-16" bedeutet und dort "Unicode" steht.
Jerryjvl
3
Ich bin mir nicht sicher, ob das Ziel von UTF-8 "Erhaltung" im Gegensatz zur Abwärtskompatibilität mit ASCII ist.
Mr. Shiny und New 安 安
@Johannes: Das Unicode-Konsortium hat beschlossen, keine Codepunkte über U + 10FFFF zuzuweisen, da diese in UTF-16 nicht dargestellt werden können. Dies hatte zur Folge, dass UTF-8 auf 4 Bytes beschränkt wurde.
user46971
1
"Unicode ist nicht UTF" - für viele ist es WTF;)
mlvljr
4

Für europäische Sprachen ist UTF-8 kleiner. Bei orientalischen Sprachen ist der Unterschied nicht so deutlich.

Beide verarbeiten alle möglichen Unicode-Zeichen, sodass die Kompatibilität keine Rolle spielt.

Mark Ransom
quelle
3

Es gibt mehr Unicode-Zeichencodierungen als Sie vielleicht denken.

  • UTF 8

    Die UTF-8-Codierung ist variabel und reicht von 1 bis 4 Byte, wobei die oberen Bits jedes Bytes als Steuerbits reserviert sind. Die führenden Bits des ersten Bytes geben die Gesamtzahl der für dieses Zeichen verwendeten Bytes an. Der Skalarwert des Codepunkts eines Zeichens ist die Verkettung der Nicht-Steuerbits. In dieser Tabelle xstehen die niedrigsten 8 Bits des Unicode-Werts, ydie nächsthöheren 8 Bits und zdie darüber liegenden Bits.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE
Brad Gilbert
quelle
1
Es gibt mehr Unicode-Zeichencodierungen als Sie aufgelistet haben. Zum Beispiel UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 und UTF-18 ... Sie können auch ein beliebiges binäres Codierungsschema zum Codieren von Unicode-Daten verwenden. Lesen Sie mehr Vergleich der Unicode-Codierungen
phuclv
1

"Unicode" ist ein weiterer Begriff für "UTF-16", bei dem es sich um eine Codierung des Unicode-Zeichensatzes in 16 Bit pro Zeichen handelt. UTF-8 codiert es in acht Bits pro Zeichen.

In beiden Fällen wird jeder Überlauf weiteren 16 oder acht Bits zugewiesen.

John Saunders
quelle
Welches ist dann besser?
R. Martinho Fernandes
"es hängt von der Situation ab.
John Saunders
Obwohl für diese spezielle Frage "Unicode" in der Tat als ein anderer Begriff für "UTF-16" missbraucht wird, ist dies im Allgemeinen nicht der Fall - siehe Jasons Antwort.
Arjan
1
Sie meinen "pro Codeeinheit", nicht "pro Zeichen"; Sowohl UTF-8 als auch UTF-16 können mehrere Codeeinheiten zur Darstellung eines Zeichens verwenden. Und "Unicode" und "UTF-16" sind mit Ausnahme der Microsoft-Terminologie NICHT dasselbe.
user46971
1

Der einzige wirkliche Vorteil bei kleinen Dateien wie Textdateien ist die resultierende Dateigröße. UTF-8 erzeugt im Allgemeinen kleinere Dateien. Bei chinesischem / japanischem Text ist dieser Unterschied möglicherweise weniger ausgeprägt.

zildjohn01
quelle
Bedenken Sie, dass sich auch die Netzwerkbandbreite und die Speichernutzung unterscheiden.
Jason Baker
1
"UTF-8 erzeugt im Allgemeinen kleinere Dateien": Im Allgemeinen nicht. UTF-8 erzeugt kleinere Dateien für ASCII-Dateien. Wenn eine Datei nur aus Unicode-Codepunkten oberhalb von U + 0800 besteht, ist sie in UTF-8 größer als in UTF-16.
sleske
0

In einem Wort ist Unicode ein Zeichensatz , während Unicode Big Endian und utf-8 zwei Kodierungen sind, die zum Speichern von Zeichen als 01 auf einem Computer verwendet werden.

thuzhf
quelle
Und der Unterschied ist ...?
David Richerby