Was ist der Unterschied zwischen UTF-8 und Unicode?

503

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

Sie sind dasselbe, nicht wahr? Kann jemand klarstellen?

Sarsnake
quelle
1
Was dieses WIKI über Unicode und die UTFs schreibt, ist meiner Meinung nach in Ordnung. Einige Kommentare dazu sind seltsam: "In UTF-8 (oder einer anderen Mehrbyte-Codierung) ist es möglich, eine Zeichenfolge in der Mitte eines Zeichens zu teilen oder abzuschneiden, was zu einer ungültigen Zeichenfolge führen kann." Eine Zeichenfolge, die UTF-8-codiert wird, ist also keine Zeichenfolge mehr, sondern ein Byte-Array oder ein Byte-Stream. Die Zeichen, aus denen die Zeichenfolge besteht, werden codiert. Natürlich kann es auch dekodiert werden. Jetzt können Sie natürlich eine utf-8-Sequenz nach dem Startbyte oder nach einem folgenden Byte schneiden, aber warum sollte jemand dies tun?
hell
Dieser Artikel über String-Datentypen ist lehrreich: mortoray.com/2013/11/27/the-string-type-is-broken - manchmal können Sie beim Arbeiten mit Strings und ihren Komponenten auf Byte-Ebene versehentlich ein Zeichen halbieren .
Everett

Antworten:

495

Um die Antworten anderer zu erweitern:

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

Computer beschäftigen sich mit Zahlen wie Bytes. Wenn Sie hier ein wenig Verlauf überspringen und Speicheradressierungsprobleme ignorieren, behandeln 8-Bit-Computer ein 8-Bit-Byte als die größte numerische Einheit, die auf der Hardware leicht dargestellt werden kann. 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 Sprache beim Rechnen, dh Englisch, in Zahlen zwischen 0 und 127 (7 Bit) zu packen. Mit 26 Buchstaben im Alphabet, sowohl in Groß- als auch in Nicht-Großbuchstaben, Zahlen und Satzzeichen, funktionierte das ziemlich gut. ASCII wurde für andere, nicht englische Sprachen um ein 8-Bit erweitert, aber die zusätzlichen 128 Zahlen / Codepunkte, die durch diese Erweiterung verfügbar gemacht werden, werden abhängig von der angezeigten 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. Daher funktioniert es einfach nicht, alle verfügbaren Zeichen in ein einziges Byte zu packen.

Grundsätzlich gibt es zwei verschiedene Arten von Codierungen: Eine erweitert den Wertebereich um weitere Bits. Beispiele für diese Codierungen wären UCS2 (2 Bytes = 16 Bit) und UCS4 (4 Bytes = 32 Bit). Sie leiden von Natur aus unter dem gleichen 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 am häufigsten bekannten Codierungen hierfür sind die UTF-Codierungen. Alle UTF-Codierungen funktionieren ungefähr gleich: Sie wählen eine Einheitsgröß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 häufigsten (englischen) Zeichen in UTF-8 nur ein Byte (zwei in UTF-16, 4 in UTF-32), andere Sprachzeichen können jedoch sechs Bytes oder mehr belegen.

Multi-Byte-Codierungen (ich sollte nach der obigen Erklärung Multi-Unit-Codierungen sagen) haben den Vorteil, dass sie relativ platzsparend sind, aber der Nachteil, dass Operationen wie das Finden von Teilzeichenfolgen, Vergleichen usw. die Zeichen alle in Unicode-Code decodieren müssen Punkte, bevor solche Operationen ausgefü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 erstellt, um Unicode-Codepunkte zu codieren. Und das ist deine Beziehung zwischen ihnen.

Windows behandelt sogenannte "Unicode" -Strings als UTF-16-Strings, während die meisten UNIX-Dateien 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 dieselbe ist wie in ASCII, und die meisten dieser Protokolle wurden in der ASCII-Ära entwickelt. Auf der anderen Seite bietet 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. Daher wurden UTF-32 und UCS4 für alle praktischen Zwecke dieselbe Codierung, da Sie in UTF-32 wahrscheinlich nicht mit Zeichen mit mehreren Einheiten umgehen müssen.

Hoffe das füllt einige Details aus.

Scott Tesler
quelle
9
Konzeptionell sind UCS-2 und UCS-4 Zeichensätze , keine Zeichenkodierungen (daher der Name).
Mechanische Schnecke
74
@ Tuukka Fehler in diesem Beitrag sind Legion. Es gibt mehr als nur zwei Versionen von ISO 8859. ASCII funktionierte nicht für Englisch, da Dinge wie geschweifte Anführungszeichen, Cent-Zeichen, Akzente und vieles mehr fehlten - bei Unicode geht es nicht nur um Nicht-Englisch. Englisch braucht es auch !! Keine Codepunkte belegen in JEDER Codierung mehr als 4 Bytes . Dieses 6-Byte-Geschäft ist absolut falsch. Sie können keinen Unicode-Skalarwert UTF-codieren, da dies besagt: Surrogate und die 66 anderen Nicht-Zeichen sind alle verboten. UCS-4 und UTF-32 sind nicht dasselbe. Es gibt kein UTF-32 mit mehreren Einheiten. UTF-16 ist nicht so effizient, wie sie vorgeben - & c & c & c!
Tchrist
1
ASCII enthält auch nicht das Pfundzeichen £ und natürlich nicht das Eurozeichen € (das erheblich jünger als ASCII ist).
TRiG
1
@tchrist Sieht aus , dass 6 Bytes sind schließlich nicht unwahrscheinlich. Siehe dies: joelonsoftware.com/articles/Unicode.html, das angibt , dass es einen Zeichenraum von 0x04000000bis gibt 0x7FFFFFFF, oder binär 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - und das sind tatsächlich 6 Bytes. 6 Bytes sind jedoch das Maximum und nicht, da der Artikel verwirrenderweise "sechs Bytes oder mehr " behauptet .
Syntaxfehler
12
@syntaxerror: "Nur Codepunkte 128 und höher werden mit 2, 3, tatsächlich bis zu 6 Bytes gespeichert." war korrekt, als es geschrieben wurde, aber später im selben Jahr (vor zwölf Jahren) wurde es ungültig. en.wikipedia.org/wiki/UTF-8 sagt: "Die ursprüngliche Spezifikation umfasste Zahlen bis zu 31 Bit (die ursprüngliche Grenze des universellen Zeichensatzes). Im November 2003 wurde UTF-8 durch RFC 3629 auf U + beschränkt 10FFFF, um den Einschränkungen der UTF-16-Zeichenkodierung zu entsprechen. Dadurch wurden alle 5- und 6-Byte-Sequenzen und etwa die Hälfte der 4-Byte-Sequenzen entfernt. "
Mooing Duck
237

Lassen Sie mich dieses Beispiel 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. Nehmen wir nun an, wir beschließen, diesen Charakter auf unserer Festplatte zu speichern. Dazu müssen wir das Zeichen im Binärformat speichern. Wir können es einfach so speichern, wie es '01101100 01001001' ist. Erledigt!

Aber Moment mal, ist '01101100 01001001' ein oder zwei Zeichen? Sie wussten, dass dies ein Zeichen ist, weil ich es Ihnen gesagt habe, aber wenn ein Computer es liest, hat er keine Ahnung. Wir brauchen also eine Art "Codierung", um den Computer anzuweisen, sie als eine 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 obigen 'UTF-8'-Format speichern möchten, müssen wir unserem Zeichen gemäß der obigen Tabelle einige' Überschriften 'voranstellen. Unser chinesisches Zeichen 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

Schreiben Sie das Ergebnis in eine Zeile:

11100110 10110001 10001001

Dies ist der UTF-8-Wert (binär) des chinesischen Zeichens! (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

PS Wenn Sie dieses Thema in Python lernen möchten, klicken Sie hier

Cheng
quelle
6
"Aber Moment mal, ist '01101100 01001001' ein oder zwei Zeichen? Sie wussten, dass dies ein Zeichen ist, weil ich es Ihnen gesagt habe, aber wenn ein Computer es liest, hat er keine Ahnung. Also brauchen wir eine Art" Codierung " Sagen Sie dem Computer, er soll es als eins behandeln. " Na gut, aber der Computer weiß immer noch nicht, ob er es mit utf-8 codieren soll?
Koray Tugay
15
@KorayTugay Der Computer weiß nicht, welche Codierung er verwenden soll. Sie müssen es mitteilen, wenn Sie ein Zeichen in einer Datei speichern und wenn Sie ein Zeichen aus einer Datei lesen.
Cheng
3
@Connor Der Computer weiß nicht, welches Format verwendet werden soll. Wenn Sie das Dokument speichern, muss der Texteditor seine Codierung explizit auf utf-8 oder das vom Benutzer gewünschte Format einstellen. Wenn ein Texteditorprogramm eine Datei liest, muss es ein Textcodierungsschema auswählen, um sie korrekt zu decodieren. Gleiches gilt, wenn Sie einen Buchstaben eingeben und eingeben. Der Texteditor muss wissen, welches Schema Sie verwenden, damit er korrekt gespeichert wird.
Cheng
2
Wie werden diese Überschriften interpretiert? Wenn ich mir die erste Tabelle anschaue, dann denke ich: Wenn das Byte mit dem Bit beginnt, wird 0das Zeichen durch 1 Biss (das aktuelle) dargestellt. Wenn das Byte mit beginnt, 110wird das Zeichen durch 2 Bytes (das aktuelle und das nächste) dargestellt. verbleibende Bits nach 10)), wenn Byte mit beginnt, 1110wird das Zeichen durch 3 Bytes, das aktuelle und die nächsten 2 Bytes (verbleibende Bits nach 10) dargestellt.
JBoy
2
Lesen Sie 10 Artikel über UTF-8; Nachdem ich dies gelesen hatte, verstand ich es innerhalb von 10 Sekunden :)
jrhee17
201

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

UTF-8 ist eine Zeichenkodierung - eine Methode zum Konvertieren von Bytefolgen in Zeichenfolgen 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önnen 4 Bytes bis zu 4 Bytes verarbeiten U-001FFFFF).

Wenn "Unicode" als Name einer Zeichenkodierung verwendet wird (z. B. als .NET Encoding.Unicode- Eigenschaft), bedeutet dies normalerweise UTF-16 , das die häufigsten Zeichen als zwei Bytes codiert. Einige Plattformen (insbesondere .NET und Java) verwenden UTF-16 als "native" Zeichenkodierung. 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 werden als "Ersatzpaare" codiert) - aber die meisten Entwickler machen sich darüber keine Sorgen, IME.

Einige Referenzen zu Unicode:

Jon Skeet
quelle
16
Ich denke, UTF-16 entspricht nur "Unicode" auf Windows-Plattformen. Benutzer verwenden UTF-8 standardmäßig unter * nix. +1 aber, gute Antwort
Jalf
10
@ Chris: Nein, ISO-8859-1 ist nicht UTF-8. UTF-8 codiert U + 0080 bis U + 00FF als zwei Bytes, nicht als eines. Windows 1252 und ISO-8859-1 sind größtenteils gleich, unterscheiden sich jedoch zwischen den Werten 0x80 und 0x99, wenn ich mich richtig erinnere, wobei ISO 8859-1 ein "Loch" hat, CP1252 jedoch Zeichen definiert.
Jon Skeet
13
Die Idee, UTF-16 "Unicode" zu nennen, ist mir unangenehm, da es verwirrend sein kann - obwohl dies nur als .NET-Konvention klar herausgestellt wurde. UTF-16 ist eine Art der Darstellung von Unicode, jedoch keine "Unicode-Codierung".
Thomasrutter
6
@unwesen: UTF-8 benötigt keine Ersatzpaare. Es stellt nur Nicht-BMP-Zeichen dar, die zunehmend längere Byte-Sequenzen verwenden.
Jon Skeet
5
@ RoyiNamir: Ja, "Unicode" wird leider oft verwendet, um "UTF-16" zu bedeuten, insbesondere unter Windows.
Jon Skeet
108

Sie sind nicht dasselbe - UTF-8 ist eine besondere Art, Unicode zu codieren.

Abhängig von Ihrer Anwendung und den Daten, die Sie verwenden möchten, können Sie aus vielen verschiedenen Codierungen auswählen. Am häufigsten sind meines Wissens UTF-8, UTF-16 und UTF-32.

Greg
quelle
10
Der Punkt ist jedoch, dass einige Editoren vorschlagen, die Datei als "Unicode" ODER "UTF-8" zu speichern. Die Erwähnung über diesen "Unicode" in diesem Fall ist UTF-16, was ich für notwendig halte.
Serhio
71

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

Martin Cote
quelle
2
Der Punkt ist jedoch, dass einige Editoren vorschlagen, die Datei als "Unicode" ODER "UTF-8" zu speichern. Die Erwähnung über diesen "Unicode" in diesem Fall ist UTF-16, was ich für notwendig halte.
Serhio
Eine Zahl, die ein Zeichen darstellt, führt auch ASCII aus.
hell
6
Lesen Sie dies vor und nach dem Betrachten der restlichen Antworten auf dieser Seite
Dodgie
33

Unicode ist ein Standard, der zusammen mit ISO / IEC 10646 den Universal Character Set (UCS) definiert, der eine Obermenge aller vorhandenen Zeichen darstellt, die zur Darstellung praktisch aller bekannten Sprachen erforderlich sind.

Unicode weist einen Namen und eine Nummer ( Zeichencode oder Codepunkt ) auf jedes Zeichen in seinem Repertoire.

Die UTF-8-Codierung ist eine Möglichkeit, diese Zeichen digital im Computerspeicher darzustellen. UTF-8 ordnet jeden Codepunkt einer Folge von Oktetten (8-Bit-Bytes) zu.

Zum Beispiel

BKS-Zeichen = Unicode-Han-Zeichen

UCS-Codepunkt = U + 24B62

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

Nachtwanderungen
quelle
Nein, UTF-8 ordnet nur Codepunkte einer Sequenz zu, die größer als 127 ist. Alles von 0 bis 127 ist keine Sequenz, sondern ein einzelnes Byte. Übrigens weist ASCII einer Zahl auch einen Namen eines Zeichens zu, so dass dies auch bei Unicode der Fall ist. Unicode stoppt jedoch nicht am Codepunkt 127, sondern geht auf 0x10ffff.
hell
2
@brightly ich unterscheide. Ascii-Zeichen werden tatsächlich einer einzelnen Bytesequenz zugeordnet. Das erste Bit, das im Fall von Code für ASCII-Zeichen 0 ist, gibt an, wie viele Bytes folgen - Null. http://www.wikiwand.com/en/UTF-8#/DescriptionSchauen Sie sich die erste Reihe an.
Nightlytrails
Für mich besteht eine Sequenz aus mehr als einem Byte. Ein ASCII-Zeichen in UTF-8 ist wie es ist ein einzelnes Byte, wobei das höchstwertige Bit auf 0 gesetzt ist. Codepunkte höher als 127 benötigen dann Sequenzen, die immer ein Startbyte und ein, zwei oder drei folgende Bytes haben. Warum würden Sie ein einzelnes Byte als "Sequenz" bezeichnen?
hell
Nun ... Oft können englischsprachige Anwälte über den absichtlichen Missbrauch in Software verblüfft sein. Hier ist es genauso. Sie können darüber streiten. Aber das wird es nicht klarer machen.
Nightlytrails
1
@brighty Hmmm, In der Mathematik ist eine Folge von 0 Elementen in Ordnung. Auch hier ist eine Folge von 1 Element in Ordnung.
chux
24

Unicode ist nur ein Standard, der einen Zeichensatz ( UCS ) und Codierungen ( UTF ) definiert, um diesen Zeichensatz zu codieren. Im Allgemeinen bezieht sich Unicode jedoch auf den Zeichensatz und nicht auf den Standard.

Lesen Sie das absolute Minimum Jeder Softwareentwickler muss unbedingt und positiv über Unicode und Zeichensätze (keine Ausreden!) Und Unicode in 5 Minuten Bescheid wissen .

Gumbo
quelle
1
@serhio: Ich weiß. Obwohl es drei verschiedene UTF-16-Codierungen gibt: Die zwei expliziten UTF-16LE- und UTF-16BE -Codierungen und die implizite UTF-16 -Codierung, bei der die Endianness mit einer Stückliste angegeben wird.
Gumbo
@Gumbo: Das Fehlen einer Stückliste bedeutet nicht, dass es sich um eine andere Codierung handelt. Es gibt nur zwei Codierungen.
Mooing Duck
Der obige Blog wurde vom CEO von Stakcoverflow verfasst.
Shailesh Pratapwar
23

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 Codepunkten zuordnet.
Jedes Zeichen hat einen eindeutigen Codepunkt (Identifikationsnummer), eine Nummer wie 9731.

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

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

basic6
quelle
1
Nein! UTF-8 ist eine gute Möglichkeit, Unicode-Zeichen zu codieren, aber wir können auch in UTF-16 oder UTF-32 codieren. Mit UTF-32 haben wir eine 1: 1-Beziehung zwischen DWORD und Codepoint, mit UTF-16 haben wir eine 1: 1-Beziehung zwischen WORD und Codepoint nur für Codepunkte des BMP, mit Ausnahme der Ersatzzeichen und Stücklisten. In UTF-8 haben wir eine 1: 1-Beziehung zwischen Byte und Codepunkt nur für Codepunkte <127.
hell
5
@brighty: Richtig, aber warum "Nein!"? Ich schrieb "UTF-8 ist eine von mehreren Codierungen", weil es auch UTF-16 und UTF-32 gibt.
basic6
16

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 lautet wie folgt:

  • Erstellen Sie ein Formular, in dem jede Position als "Codepunkt" oder "Codeposition" bezeichnet wird.
  • Die gesamten Positionen reichen von U + 0000 bis U + 10FFFF;
  • Bisher sind einige Positionen mit Zeichen besetzt und andere Positionen sind gespeichert oder leer.
  • Beispielsweise ist 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" nicht im Computer für das Zeichen "$" speichern.

Es muss eine Codierungsmethode geben.

Dann kommen 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.

wengeezhang
quelle
1
Im Allgemeinen ist UTF-8 die einzige Variante, die heute verwendet wird.
Rick James
2
ISO 10646 ist ein identischer Standard wie der Unicode-Zeichensatz. Unicode definiert viele andere Dinge als den Zeichensatz, wie z. B. Sortierregeln, Groß- und Kleinschreibung usw. ISO 10646 ist nur der Zeichensatz (von dem es derzeit über 130.000 gibt). Das Unicode-Konsortium und ISO entwickeln Unicode gemeinsam, wobei sich ISO nur mit dem Zeichensatz und seinen Codierungen befasst und Unicode auch Zeicheneigenschaften und Regeln für die Textverarbeitung definiert.
Thomasrutter
12

Ich habe die Links in Gumbos Antwort überprüft und wollte einen Teil dieser Dinge hier einfügen, damit sie auch im Stapelüberlauf vorhanden sind.

"... Einige Leute 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 tatsächlich 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 Art, über Charaktere zu denken, und Sie müssen die Unicode-Art verstehen, über Dinge zu denken, sonst macht nichts Sinn.

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 wird ein Buchstabe einem sogenannten Codepunkt zugeordnet, 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 Zahl zugewiesen, die wie folgt geschrieben ist: U + 0639. Diese magische Zahl 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, sagen wir, wir haben eine Zeichenfolge:

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 man dies im Speicher speichert oder in einer E-Mail-Nachricht darstellt ... "

"... Hier kommen Kodierungen ins Spiel.

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

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

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

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

kommradHomer
quelle
In ASCII wird ein Buchstabe auch einem Codepunkt zugeordnet, nicht nur in Unicode.
hell
8

UTF-8 ist ein mögliches Codierungsschema für Unicode Text.

Unicode ist ein Standard mit breitem Anwendungsbereich, der über 130.000 Zeichen definiert und jedem einen numerischen Code (einen Codepunkt) zuweist. Außerdem werden Regeln zum Sortieren, Normalisieren, Ändern der Groß- und Kleinschreibung usw. definiert. Ein Zeichen in Unicode wird durch einen Codepunkt von Null bis einschließlich 0x10FFFF dargestellt, obwohl einige Codepunkte reserviert sind und nicht für Zeichen verwendet werden können.

Es gibt mehr als eine Möglichkeit, eine Zeichenfolge von Unicode-Codepunkten in einen Binärstrom zu codieren. Diese werden als "Codierungen" bezeichnet. Die einfachste Codierung ist UTF-32 , bei der jeder Codepunkt einfach als 32-Bit-Ganzzahl mit einer Breite von jeweils 4 Byte gespeichert wird.

UTF-8 ist eine weitere Codierung und wird aufgrund einer Reihe von Vorteilen gegenüber UTF-32 und anderen zum De-facto-Standard. UTF-8 codiert als Folge von Einzelbytewerten. Jeder Codepunkt kann eine variable Anzahl dieser Bytewerte verwenden. Codepunkte im ASCII-Bereich werden nackt codiert, um mit ASCII kompatibel zu sein. Codepunkte außerhalb dieses Bereichs verwenden eine variable Anzahl von Bytes, entweder 2, 3 oder 4, je nachdem, in welchem ​​Bereich sie sich befinden.

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

  • ASCII-Zeichen werden genau wie in ASCII codiert, sodass eine ASCII-Zeichenfolge auch eine gültige UTF-8-Zeichenfolge ist.

  • Binäre Sortierung: Das Sortieren von UTF-8-Zeichenfolgen mit einer naiven binären Sortierung führt weiterhin dazu, dass alle Codepunkte in numerischer Reihenfolge sortiert werden.

  • Zeichen, die mehrere Bytes erfordern, enthalten keine Bytewerte im ASCII-Bereich, sodass sichergestellt ist, dass ein Teil davon nicht mit ASCII-Zeichen verwechselt werden kann. Dies ist auch ein Sicherheitsmerkmal.

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

  • Direktzugriff: 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 der Anfang des nächsten oder aktuellen Zeichens gefunden werden, ohne dass vorwärts gescannt werden muss oder mehr als ein paar Bytes rückwärts oder etwas am Anfang des Streams lesen.

thomasrutter
quelle
Ein paar kleinere Punkte: [1] nicht „ASCII - Zeichen genau codiert sind , als sie in sind ASCII geändert werden , um „ASCII - Zeichen genau codiert sind , als sie in sind UTF-8 ? [2] Der Satz "Die Codes in Unicode ..." ist (für mich) unklar. Meinen Sie "Unicode-Codepunkte ..." ?
Skomisa
@skomisa für Punkt 1 meinte ich, dass die Codierung von Zeichen innerhalb des ASCII-Bereichs für ASCII und für UTF-8 identisch ist.
Thomasrutter
Für Punkt 2 ist das ein fairer Punkt und ich werde das bearbeiten, um es klarer zu machen
Thomasrutter
2

Sie sind dasselbe, nicht wahr?

Nein, das sind sie nicht.


Ich denke, der erste Satz der Wikipedia-Seite, auf die Sie verwiesen haben, 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 ein bis vier 8-Bit-Bytes codiert werden können.

Um dies zu erläutern:

  • Unicode ist ein Standard, der eine Zuordnung von Zeichen zu Zahlen definiert, die sogenannten Codepunkte (wie im folgenden Beispiel). Die vollständige Zuordnung finden Sie 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 eine Möglichkeit / ein Algorithmus, jeden dieser Codepunkte in eine Folge von Bits oder eine Folge von Bits in die entsprechenden Codepunkte umzuwandeln. Beachten Sie, dass es für Unicode viele alternative Codierungen gibt.


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

Dimos
quelle
2

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

Beachten Sie, dass es sich um die binäre Darstellung von 224 handelt, nicht um die binäre Form 0b11100000.

Remykarem
quelle
2

Dieser Artikel erklärt alle Details http://kunststube.net/encoding/

SCHREIBEN AN BUFFER

Wenn Sie in ein 4-Byte-Puffer-Symbol mit UTF8-Codierung schreiben, sieht Ihre Binärdatei folgendermaßen aus:

00000000 11100011 10000001 10000010

Wenn Sie in ein 4-Byte-Puffer-Symbol mit UTF16-Codierung schreiben, sieht Ihre Binärdatei folgendermaßen aus:

00000000 00000000 00110000 01000010

Wie Sie sehen können, wirkt sich dies je nach der Sprache, die Sie in Ihren Inhalten verwenden würden, entsprechend auf Ihr Gedächtnis aus.

zB Für dieses bestimmte Symbol: Die UTF16-Codierung ist effizienter, da wir 2 freie Bytes für das nächste Symbol verwenden können. Dies bedeutet jedoch nicht, dass Sie UTF16 für das japanische Alphabet verwenden müssen.

LESEN AUS DEM PUFFER

Wenn Sie nun die obigen Bytes lesen möchten, müssen Sie wissen, in welche Codierung es geschrieben wurde, und es wieder korrekt decodieren.

Beispiel: Wenn Sie dies dekodieren: 00000000 11100011 10000001 10000010 in UTF16-Codierung, erhalten Sie am Ende nicht

Hinweis: Codierung und Unicode sind zwei verschiedene Dinge. Unicode ist die große (Tabelle), wobei jedes Symbol einem eindeutigen Codepunkt zugeordnet ist. zB Symbol (Buchstabe) hat einen (Codepunkt) : 30 42 (hex). Die Codierung hingegen ist ein Algorithmus, der Symbole beim Speichern auf Hardware auf eine geeignetere Weise konvertiert.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

Geben Sie hier die Bildbeschreibung ein

InGeek
quelle
sehr gut verlinkter Artikel, hoffentlich bleibt er weiterhin aktiv
yolob 21
0

UTF-8 ist eine Methode zum Codieren von Unicode-Zeichen unter Verwendung von 8-Bit-Sequenzen.

Unicode ist ein Standard für die Darstellung einer Vielzahl von Zeichen aus vielen Sprachen.

aka Mahesh
quelle
4
"8-Bit-Sequenzen" ...? Vielleicht möchten Sie das genauer spezifizieren ...
täuschen