it-swarm.com.de

Was ist der Unterschied zwischen UTF-8 und Unicode?

Ich habe widersprüchliche Meinungen von Leuten gehört - laut der Wikipedia UTF-8 Seite.

Sie sind das gleiche, nicht wahr? Kann das jemand klären?

440
sarsnake

Um die Antworten zu erweitern, die andere gegeben haben:

Wir haben viele Sprachen mit vielen Zeichen, die Computer idealerweise anzeigen sollten. Unicode weist jedem Zeichen eine eindeutige Nummer oder einen Codepunkt zu.

Computer behandeln Zahlen wie Bytes ... überspringen hier ein wenig Verlauf und ignorieren Probleme mit der Speicheradressierung. 8-Bit-Computer behandeln ein 8-Bit-Byte als die größte auf der Hardware leicht darstellbare numerische Einheit. 16-Bit-Computer werden erweitert das auf zwei Bytes und so weiter.

Alte Zeichenkodierungen wie ASCII stammen aus der (Vor-) 8-Bit-Ära und versuchen, die vorherrschende Computersprache, dh Englisch, in Zahlen zwischen 0 und 127 zu packen (7 Bits) Mit 26 Buchstaben im Alphabet, sowohl in Groß- als auch in Nicht-Großbuchstaben, Zahlen und Interpunktionszeichen, funktionierte das ziemlich gut. ASCII wurde für andere um ein 8. Bit erweitert, Nicht-englische Sprachen, aber die zusätzlichen 128 Zahlen/Codepunkte, die durch diese Erweiterung verfügbar gemacht werden, werden je nach angezeigter Sprache unterschiedlichen Zeichen zugeordnet. Die ISO-8859-Standards sind die häufigsten Formen dieser Zuordnung: ISO-8859-1 und ISO-8859-15 (auch bekannt als ISO-Latin-1, latin1, und ja, es gibt auch zwei verschiedene Versionen des ISO-Standards 8859).

Dies reicht jedoch nicht aus, wenn Sie Zeichen aus mehr als einer Sprache darstellen möchten, sodass es einfach nicht funktioniert, alle verfügbaren Zeichen in ein einziges Byte zu packen.

Grundsätzlich gibt es zwei verschiedene Arten von Kodierungen: Eine erweitert den Wertebereich um weitere Bits. Beispiele für diese Codierungen wären UCS2 (2 Bytes = 16 Bits) und UCS4 (4 Bytes = 32 Bits). Sie haben von Natur aus das gleiche Problem wie die Standards ASCII und ISO-8859, da ihr Wertebereich immer noch begrenzt ist, selbst wenn der Grenzwert erheblich höher ist.

Die andere Art der Codierung verwendet eine variable Anzahl von Bytes pro Zeichen, und die bekanntesten Codierungen hierfür sind die UTF-Codierungen. Alle UTF-Codierungen funktionieren ungefähr auf dieselbe Weise: Sie wählen eine Einheitengröße, die für UTF-8 8 Bit, für UTF-16 16 Bit und für UTF-32 32 Bit beträgt. Der Standard definiert dann einige dieser Bits als Flags: Wenn sie gesetzt sind, ist die nächste Einheit in einer Folge von Einheiten als Teil desselben Zeichens zu betrachten. Wenn sie nicht festgelegt sind, repräsentiert diese Einheit ein Zeichen vollständig. Daher belegen die gebräuchlichsten (englischen) Zeichen in UTF-8 nur ein Byte (zwei in UTF-16, 4 in UTF-32), während andere Sprachzeichen sechs Byte oder mehr belegen können.

Multibyte-Codierungen (ich sollte nach der obigen Erklärung sagen, dass sie mehrere Einheiten umfassen) haben den Vorteil, dass sie relativ platzsparend sind, aber der Nachteil, dass Operationen wie das Auffinden von Teilzeichenfolgen, Vergleichen usw. die Zeichen in Unicode-Code decodieren müssen Punkte, bevor solche Operationen durchgeführt werden können (es gibt jedoch einige Verknüpfungen).

Sowohl die UCS-Standards als auch die UTF-Standards codieren die in Unicode definierten Codepunkte. Theoretisch könnten diese Codierungen verwendet werden, um eine beliebige Zahl zu codieren (innerhalb des Bereichs, den die Codierung unterstützt) - aber natürlich wurden diese Codierungen zum Codieren von Unicode-Codepunkten erstellt. Und das ist deine Beziehung zwischen ihnen.

Windows behandelt sogenannte "Unicode" -Strings als UTF-16-Strings, während die meisten UNIX-Systeme heutzutage standardmäßig UTF-8 verwenden. Kommunikationsprotokolle wie HTTP funktionieren in der Regel am besten mit UTF-8, da die Einheitengröße in UTF-8 mit der in ASCII übereinstimmt und die meisten dieser Protokolle in der Ära ASCII) erstellt wurden Andererseits liefert UTF-16 die beste durchschnittliche Speicherplatz-/Verarbeitungsleistung, wenn alle lebenden Sprachen dargestellt werden.

Der Unicode-Standard definiert weniger Codepunkte, als in 32 Bit dargestellt werden können. Aus praktischen Gründen haben UTF-32 und UCS4 die gleiche Codierung erhalten, da es unwahrscheinlich ist, dass Sie in UTF-32 mit Zeichen mit mehreren Einheiten arbeiten müssen.

Hoffe, das füllt einige Details.

439
unwesen

"Unicode" wird je nach Kontext leider unterschiedlich verwendet. Seine korrekteste Verwendung (IMO) ist ein codierter Zeichensatz , dh ein Zeichensatz und eine Zuordnung zwischen den Zeichen und der Ganzzahl Codepunkte , die sie darstellen.

TF-8 ist eine Zeichenkodierung - eine Methode zum Konvertieren von Folgen von Bytes in Folgen von Zeichen und umgekehrt. Es deckt den gesamten Unicode-Zeichensatz ab. ASCII wird als einzelnes Byte pro Zeichen codiert, und andere Zeichen benötigen abhängig von ihrem genauen Codepunkt mehr Bytes (bis zu 4 Bytes für alle derzeit definierten Codepunkte, dh bis zu U-0010FFFF, und tatsächlich könnten 4 Bytes bis zu U-001FFFFF bewältigen.

Wenn "Unicode" als Name einer Zeichencodierung verwendet wird (z. B. als .NET Encoding.Unicode -Eigenschaft), bedeutet dies normalerweise TF-16 , das die häufigsten Zeichen codiert als zwei Bytes. Einige Plattformen (insbesondere .NET und Java) verwenden UTF-16 als "native" Zeichencodierung. Dies führt zu haarigen Problemen, wenn Sie sich Gedanken über Zeichen machen müssen, die nicht in einem einzigen UTF-16-Wert codiert werden können (sie sind als "Ersatzpaare" codiert) - aber die meisten Entwickler machen sich darüber keine Sorgen, IME.

Einige Referenzen zu Unicode:

193
Jon Skeet

Lassen Sie mich dieses Thema anhand eines Beispiels veranschaulichen:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Bisher nichts Magisches, es ist sehr einfach. Angenommen, wir möchten diesen Charakter auf unserer Festplatte speichern. Dazu müssen wir das Zeichen im Binärformat speichern. Wir können es einfach als '01101100 01001001' speichern. Getan!

Aber warte mal, ist '01101100 01001001' ein Zeichen oder zwei Zeichen? Sie wussten, dass dies ein Charakter ist, weil ich es Ihnen gesagt habe, aber wenn ein Computer es liest, hat er keine Ahnung. Wir brauchen also eine Art "Kodierung", um den Computer anzuweisen, ihn als einen zu behandeln.

Hier kommen die Regeln von 'UTF-8' ins Spiel: http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Wenn wir dieses Zeichen im UTF-8-Format speichern möchten, müssen wir dem Zeichen gemäß der obigen Tabelle einige Kopfzeilen voranstellen. Unser chinesisches Schriftzeichen ist 16 Bit lang (zählen Sie den Binärwert selbst), daher verwenden wir das Format in Zeile 3, da es genügend Platz bietet:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Das Ergebnis in eine Zeile schreiben:

11100110 10110001 10001001

Dies ist der UTF-8-Wert (Binärwert) des chinesischen Schriftzeichens! (Bestätigen Sie es selbst: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Zusammenfassung

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P.S. Wenn Sie dieses Thema in Python lernen möchten, hier klicken

190
Cheng

Sie sind nicht dasselbe - UTF-8 ist eine bestimmte Art der Unicode-Codierung.

Abhängig von Ihrer Anwendung und den Daten, die Sie verwenden möchten, können Sie aus vielen verschiedenen Codierungen auswählen. Die gebräuchlichsten sind, soweit ich weiß, UTF-8, UTF-16 und UTF-32.

107
Greg

Unicode definiert nur Codepunkte, dh eine Zahl, die ein Zeichen darstellt. Wie Sie diese Codepunkte im Speicher ablegen, hängt von der von Ihnen verwendeten Kodierung ab. UTF-8 ist unter anderem eine Möglichkeit, Unicode-Zeichen zu codieren.

63
Martin Cote

Unicode ist ein Standard, der zusammen mit ISO/IEC 10646 Universal Character Set (UCS) definiert, eine Obermenge von allem Vorhandene Zeichen, die für praktisch alle bekannten Sprachen erforderlich sind.

Unicode weist jedem Zeichen in seinem Repertoire einen Namen und eine Nummer ( Zeichencode oder Code-Point) zu.

Mit der UTF-8-Codierung können diese Zeichen im Computerspeicher digital dargestellt werden. UTF-8 bildet jeden Codepunkt in eine Folge von Oktetten (8-Bit-Bytes) ab

Zum Beispiel

BKS-Zeichen = nicode-Han-Zeichen

BKS-Code-Punkt = U + 24B62

UTF-8-Codierung = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

29
nightlytrails

nicode ist nur ein Standard, der einen Zeichensatz ( UCS ) und Codierungen ( UTF DEFINIERT ) zum Codieren dieses Zeichensatzes. Im Allgemeinen bezieht sich Unicode jedoch auf den Zeichensatz und nicht auf den Standard.

Lesen Sie Das absolute Minimum, das jeder Softwareentwickler unbedingt unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!) und nicode in 5 Minuten .

24
Gumbo

Die vorhandenen Antworten erklären bereits viele Details, aber hier ist eine sehr kurze Antwort mit der direktesten Erklärung und dem direktesten Beispiel.

Unicode ist der Standard, der Zeichen zu Codepunkten zuordnet.
Jedes Zeichen hat einen eindeutigen Codepunkt (Identifikationsnummer), bei der es sich um eine Nummer wie 9731 handelt.

UTF-8 ist ein das  encoding der Codepunkte.
Um alle Zeichen auf der Festplatte (in einer Datei) zu speichern, teilt UTF-8 Zeichen in bis zu 4 Bytes (8-Bit-Sequenzen) auf. UTF-8 ist eine von mehreren Codierungen (Methoden zur Darstellung von Daten). In Unicode steht der (dezimale) Codepunkt 9731 beispielsweise für einen Schneemann (), der aus 3 Bytes in UTF-8 besteht: E2 98 83

Hier ist ein sortierte Liste mit einigen zufälligen Beispielen .

21
basic6

1. Unicode

Es gibt viele Zeichen auf der ganzen Welt, wie "$, &, h, a, t,?, 张, 1, =, + ...".

Dann kommt eine Organisation, die sich diesen Charakteren widmet,

Sie machten einen Standard namens "Unicode".

Der Standard sieht folgendermaßen aus:

  • erstellen Sie eine Form, in der jede Position als "Codepunkt" oder "Codeposition" bezeichnet wird.
  • Die gesamten Positionen reichen von U + 0000 bis U + 10FFFF;
  • Bisher sind einige Positionen mit Zeichen belegt, andere Positionen sind gespeichert oder leer.
  • Beispielsweise wird die Position "U + 0024" mit dem Zeichen "$" gefüllt.

PS: Natürlich gibt es eine andere Organisation namens ISO, die einen anderen Standard beibehält - "ISO 10646" - fast gleich.

2. UTF-8

Wie oben ist U + 0024 nur eine Position, daher können wir "U + 0024" für das Zeichen "$" nicht im Computer speichern.

Es muss eine Codierungsmethode geben.

Dann gibt es Codierungsmethoden wie UTF-8, UTF-16, UTF-32, UCS-2.

Unter UTF-8 wird der Codepunkt "U + 0024" in 00100100 codiert.

00100100 ist der Wert, den wir im Computer für "$" speichern.

15
wengeezhang

Ich habe die Links in Gumbos Antwort überprüft und wollte einen Teil dieser Dinge hier einfügen, damit sie auch auf Stack Overflow existieren.

"... Manche Menschen sind der Meinung, dass Unicode einfach ein 16-Bit-Code ist, bei dem jedes Zeichen 16 Bit benötigt und daher 65.536 mögliche Zeichen vorhanden sind. Dies ist eigentlich nicht korrekt. Es ist der häufigste Mythos über Unicode Also, wenn Sie das gedacht haben, fühlen Sie sich nicht schlecht.

In der Tat hat Unicode eine andere Denkweise für Zeichen, und Sie müssen die Unicode-Denkweise für Dinge verstehen, da sonst nichts Sinn ergibt.

Bisher haben wir angenommen, dass ein Buchstabe einigen Bits zugeordnet ist, die Sie auf der Festplatte oder im Speicher speichern können:

A -> 0100 0001

In Unicode entspricht ein Buchstabe einem so genannten Codepunkt, der immer noch nur ein theoretisches Konzept ist. Wie dieser Codepunkt im Speicher oder auf der Festplatte dargestellt wird, ist eine ganz andere Geschichte ... "

"... Jedem platonischen Buchstaben in jedem Alphabet wird vom Unicode-Konsortium eine magische Nummer zugewiesen, die folgendermaßen lautet: U + 0639. Diese magische Nummer wird als Codepunkt bezeichnet. Das U + bedeutet" Unicode "und die Zahlen sind hexadezimal. U + 0639 ist der arabische Buchstabe Ain. Der englische Buchstabe A wäre U + 0041 .... "

"... OK, also sagen wir, wir haben einen String:

Hallo

dies entspricht in Unicode diesen fünf Codepunkten:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Nur ein paar Codepunkte. Zahlen, wirklich. Wir haben noch nichts darüber gesagt, wie dies gespeichert oder in einer E-Mail dargestellt werden soll ... "

"... Hier kommen die Kodierungen ins Spiel.

Die früheste Idee für die Unicode-Codierung, die zum Mythos über die beiden Bytes führte, war, diese Zahlen einfach in jeweils zwei Bytes zu speichern. Also Hallo wird

00 48 00 65 00 6C 00 6C 00 6F

Richtig? Nicht so schnell! Könnte es nicht auch sein:

48 00 65 00 6C 00 6C 00 6F 00? ... "

12
kommradHomer

nicode ist ein weit gefasster Standard, der über 130.000 Zeichen definiert und jedem einen numerischen Code (einen "Codepunkt") zuweist. Außerdem werden Regeln definiert, wie dieser Text sortiert, normalisiert, in Groß- und Kleinschreibung geändert und vieles mehr. Ein Unicode-Zeichen wird durch einen Codepunkt von 0 bis einschließlich 0x10FFFF dargestellt, obwohl einige Codepunkte reserviert sind und nicht für Zeichen verwendet werden können.

Die Codes in Unicode können in mehr als einer Codierung dargestellt werden. Das einfachste ist UTF-32, das den Codepunkt einfach als 32-Bit-Ganzzahl mit einer Breite von jeweils 4 Byte codiert.

TF-8 ist eine weitere Kodierung, die schnell zum De-facto-Standard wird. Es kodiert als Folge von Bytewerten. Jeder Codepunkt kann eine variable Anzahl dieser Bytes verwenden. Codepunkte im Bereich ASCII sind zur Kompatibilität mit ASCII blank codiert. Codepunkte außerhalb dieses Bereichs verwenden je nach Bereich eine variable Anzahl von Bytes, entweder 2, 3 oder 4 sind in.

UTF-8 wurde unter Berücksichtigung der folgenden Eigenschaften entwickelt:

  • ASCII-Zeichen werden genauso wie ASCII-Zeichen codiert, sodass eine ASCII Zeichenfolge auch als UTF-8 gültig ist.

  • Binäre Sortierung: Wenn Sie UTF-8-Zeichenfolgen nach einer naiven binären Sortierung sortieren, werden weiterhin alle Codepunkte in numerischer Reihenfolge sortiert.

  • Zeichen außerhalb des Bereichs ASCII verwenden keine Bytes im Bereich ASCII, um sicherzustellen, dass sie nicht mit ASCII= Zeichen verwechselt werden können Dies ist auch ein Sicherheitsmerkmal.

  • UTF-8 kann einfach validiert und von anderen Zeichenkodierungen durch einen Validator unterschieden werden. Text in anderen 8-Bit- oder Multi-Byte-Codierungen wird sehr selten auch als UTF-8 validiert.

  • Zufälliger Zugriff: An jedem Punkt in der UTF-8-Zeichenfolge kann festgestellt werden, ob das Byte an dieser Position das erste Byte eines Zeichens ist oder nicht, und es kann zum Anfang dieses Zeichens zurückgegangen werden, ohne dass auf irgendetwas an verwiesen werden muss der Anfang der Zeichenfolge.

3
thomasrutter

Sie sind das gleiche, nicht wahr?

Nein, das sind sie nicht.


Ich denke, der erste Satz des von Ihnen genannten Wikipedia-Seite gibt eine schöne, kurze Zusammenfassung:

UTF-8 ist eine Zeichencodierung mit variabler Breite, mit der alle 1.112.064 gültigen Codepunkte in Unicode mit einem bis vier 8-Bit-Bytes codiert werden können.

Ausarbeiten:

  • Unicode ist ein Standard, der eine Zuordnung von Zeichen zu Zahlen definiert. Die sogenannten Codepunkte (wie im folgenden Beispiel). Für die vollständige Zuordnung können Sie einen Blick werfen hier .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 ist eine der Möglichkeiten, diese Codepunkte in einer Form zu codieren, die ein Computer verstehen kann, auch bekannt als Bits . Mit anderen Worten, es ist ein Weg/Algorithmus, um jeden dieser Codepunkte in eine Folge von Bits umzuwandeln oder eine Folge von Bits in äquivalente Codepunkte umzuwandeln. Beachten Sie, dass es für Unicode viele alternative Codierungen gibt.


Joel gibt eine wirklich nette Erklärung und einen Überblick über die Geschichte hier .

1
Dimos

Wenn ich zusammenfassen darf, was ich aus diesem Thread gesammelt habe:

Unicode 'übersetzt' Zeichen in Ordnungszahlen (in Dezimalform).

à = 224

UTF-8 ist eine Codierung, die diese Zahlen in binäre Darstellungen 'übersetzt.

224 = 11000011 10100000
0
Raimi bin Karim

TF-8 ist eine Methode zum Codieren von Unicode-Zeichen mit 8-Bit-Sequenzen.

nicode ist ein Standard zur Darstellung einer Vielzahl von Zeichen aus vielen Sprachen.

0
akaMahesh