it-swarm.com.de

Was ist Unicode, UTF-8, UTF-16?

Was ist die Grundlage für Unicode und warum UTF-8 oder UTF-16? Ich habe dies bei Google recherchiert und auch hier gesucht, aber mir ist nicht klar. 

In VSS wird beim Dateivergleich manchmal eine Meldung angezeigt, dass die beiden Dateien unterschiedliche UTF-Werte haben. Warum wäre das so?

Bitte erläutern Sie es in einfachen Worten.

318
SoftwareGeek

Warum brauchen wir Unicode?

In den (nicht allzu) frühen Tagen existierte nur ASCII. Dies war in Ordnung, da nur ein paar Steuerzeichen, Satzzeichen, Zahlen und Buchstaben wie in diesem Satz benötigt wurden. Leider war die heutige seltsame Welt der globalen Interkommunikation und der sozialen Medien nicht vorgesehen, und es ist nicht allzu ungewöhnlich, Englisch, Spanisch, Spanisch und Japanisch im selben Dokument zu sehen (ich hoffe, ich habe kein altes gebrochen) Browser).

Nehmen wir an, Joe Average ist ein Softwareentwickler. Er besteht darauf, dass er immer nur Englisch braucht und als solches nur ASCII verwenden möchte. Dies ist möglicherweise in Ordnung für Joe, den Benutzer , aber nicht für Joe, den Softwareentwickler . Ungefähr die Hälfte der Welt verwendet nicht-lateinische Zeichen und die Verwendung von ASCII ist für diese Leute wohl unbedacht, und außerdem macht er seine Software für eine große und wachsende Wirtschaft unzugänglich.

Daher ist ein umfassender Zeichensatz mit allen Sprachen erforderlich. So kam Unicode. Es weist jedem Zeichen eine eindeutige Nummer zu, die als Codepunkt bezeichnet wird. Ein Vorteil von Unicode gegenüber anderen möglichen Mengen besteht darin, dass die ersten 256 Codepunkte mit ISO-8859-1 und damit auch mit ASCII identisch sind. Darüber hinaus kann die überwiegende Mehrheit der häufig verwendeten Zeichen in einem Bereich mit der Bezeichnung Basic Multilingual Plane (BMP) nur durch zwei Bytes dargestellt werden. . Jetzt wird eine Zeichenkodierung benötigt, um auf diesen Zeichensatz zuzugreifen. Wie die Frage zeigt, werde ich mich auf UTF-8 und UTF-16 konzentrieren.

Speicherüberlegungen

Wie viele Bytes geben Zugriff auf welche Zeichen in diesen Codierungen?

  • UTF-8:
    • 1 Byte: Standard-ASCII
    • 2 Bytes: Arabisch, Hebräisch, die meisten europäischen Schriften (insbesondere mit Ausnahme von Georgisch )
    • 3 Bytes: BMP
    • 4 Bytes: Alle Unicode-Zeichen
  • UTF-16:
    • 2 Bytes: BMP
    • 4 Bytes: Alle Unicode-Zeichen

Es ist erwähnenswert, dass Zeichen, die nicht in BMP enthalten sind, alte Skripte, mathematische Symbole, musikalische Symbole und seltenere Chinesisch/Japanisch/Koreanisch (CJK) Zeichen umfassen.

Wenn Sie hauptsächlich mit ASCII Zeichen arbeiten, ist UTF-8 mit Sicherheit speichereffizienter. Wenn Sie jedoch hauptsächlich mit nichteuropäischen Skripten arbeiten, kann die Verwendung von UTF-8 zu einer bis zu 1,5-mal geringeren Speichereffizienz als UTF-16 führen. Wenn Sie mit großen Textmengen wie großen Webseiten oder langen Word-Dokumenten arbeiten, kann dies die Leistung beeinträchtigen.

Grundlagen der Codierung

Hinweis: Wenn Sie wissen, wie UTF-8 und UTF-16 codiert sind, fahren Sie mit dem nächsten Abschnitt fort, um praktische Anwendungen zu finden.

  • UTF-8: Für die Standardzeichen ASCII (0-127) sind die UTF-8-Codes identisch. Dies macht UTF-8 ideal, wenn Abwärtskompatibilität mit vorhandenem ASCII-Text erforderlich ist. Für andere Zeichen sind 2 bis 4 Byte erforderlich. Dies erfolgt durch Reservieren einiger Bits in jedem dieser Bytes, um anzuzeigen, dass es Teil eines Mehrbytezeichens ist. Insbesondere ist das erste Bit jedes Bytes 1, um Konflikte mit den Zeichen ASCII zu vermeiden.
  • UTF-16: Für gültige BMP -Zeichen ist die UTF-16-Darstellung einfach ihr Codepunkt. Für Nicht-BMP-Zeichen führt UTF-16 jedoch Ersatzpaare ein . In diesem Fall wird eine Kombination aus zwei Zwei-Byte-Teilen einem Nicht-BMP-Zeichen zugeordnet. Diese Zwei-Byte-Teile stammen aus dem numerischen Bereich BMP, sind jedoch nach dem Unicode-Standard als BMP Zeichen ungültig. Da UTF-16 über zwei Bytes als Basiseinheit verfügt, wird es außerdem von Endianness beeinflusst. Um dies zu kompensieren, kann eine reservierte Bytereihenfolgemarkierung an den Anfang eines Datenstroms gesetzt werden, die die Endianität anzeigt. Wenn Sie also eine UTF-16-Eingabe lesen und keine Endianness angegeben ist, müssen Sie dies überprüfen.

Wie zu sehen ist, sind UTF-8 und UTF-16 bei weitem nicht miteinander kompatibel. Wenn Sie also E/A ausführen, stellen Sie sicher, dass Sie wissen, welche Codierung Sie verwenden! Weitere Einzelheiten zu diesen Kodierungen finden Sie in den TF-FAQ .

Praktische Überlegungen zur Programmierung

Zeichen- und String-Datentypen: Wie werden sie in der Programmiersprache codiert? Wenn es sich um unformatierte Bytes handelt, können in der Minute, in der Sie versuchen, Nicht-ASCII-Zeichen auszugeben, einige Probleme auftreten. Auch wenn der Zeichentyp auf einer UTF-Datei basiert, bedeutet dies nicht, dass die Zeichenfolgen eine ordnungsgemäße UTF-Datei sind. Sie können Byte-Sequenzen zulassen, die unzulässig sind. Im Allgemeinen müssen Sie eine Bibliothek verwenden, die UTF unterstützt, z. B. ICU für C, C++ und Java. Wenn Sie in jedem Fall etwas anderes als die Standardkodierung eingeben/ausgeben möchten, müssen Sie diese zuerst konvertieren.

Empfohlene/Standard-/dominante Codierungen: Wenn Sie die Wahl haben, welche UTF verwendet werden soll, ist es normalerweise am besten, die empfohlenen Standards für die Umgebung zu befolgen, in der Sie arbeiten Zum Beispiel ist UTF-8 im Web dominant, und seit HTML5 ist es die empfohlene Codierung . Umgekehrt basieren sowohl .NET- als auch Java-Umgebungen auf einem UTF-16-Zeichentyp. Verwirrenderweise (und fälschlicherweise) wird häufig auf die "Unicode-Codierung" verwiesen, die sich in der Regel auf die in einer bestimmten Umgebung vorherrschende UTF-Codierung bezieht.

Bibliotheksunterstützung: Die von Ihnen verwendeten Bibliotheken unterstützen eine Art Codierung. Welcher? Unterstützen sie die Eckfälle? Da die Notwendigkeit die Mutter der Erfindung ist, unterstützen UTF-8-Bibliotheken im Allgemeinen 4-Byte-Zeichen ordnungsgemäß, da 1, 2 und sogar 3-Byte-Zeichen häufig vorkommen können. Allerdings unterstützen nicht alle vorgeblichen UTF-16-Bibliotheken Ersatzpaare ordnungsgemäß, da sie sehr selten vorkommen.

Zeichen zählen: In Unicode gibt es kombinierte Zeichen. Zum Beispiel bilden der Codepunkt U + 006E (n) und U + 0303 (eine kombinierende Tilde) ñ, aber der Codepunkt U + 00F1 bildet ñ. Sie sollten identisch aussehen, aber ein einfacher Zählalgorithmus gibt für das erste Beispiel 2 und für das letztere 1 zurück. Dies ist nicht unbedingt falsch, kann aber auch nicht das gewünschte Ergebnis sein.

Gleichheitsvergleich: A, А und Α sehen gleich aus, sind jedoch lateinisch, kyrillisch und griechisch. Sie haben auch Fälle wie C und Ⅽ, einer ist ein Buchstabe, der andere eine römische Zahl. Darüber hinaus müssen wir auch die kombinierenden Zeichen berücksichtigen. Weitere Informationen finden Sie unter Doppelte Zeichen in Unicode .

Ersatzpaare: Diese kommen auf SO oft genug vor, daher werde ich nur einige Beispiellinks bereitstellen:

Andere?:

497
DPenner1
  • Unicode
    • ist eine Reihe von Charakteren, die auf der ganzen Welt verwendet werden
  • UTF-8
    • eine Zeichencodierung, die alle möglichen Zeichen (Codepunkte genannt) in Unicode codieren kann.
    • codeeinheit ist 8 Bit
    • verwenden Sie ein bis vier Codeeinheiten, um Unicode zu codieren
    • 00100100 für " $ " (ein 8-Bit); 11000010 10100010 für " ¢ " (zwei 8-Bit); 11100010 10000010 10101100 für"(drei 8-Bit)
  • UTF-16
    • eine andere Zeichenkodierung 
    • codeeinheit ist 16 Bit
    • verwenden Sie ein bis zwei Codeeinheiten, um Unicode zu codieren
    • 00000000 00100100 für " $ " (ein 16-Bit); 11011000 01010010 11011111 01100010 für " ???? " (zwei 16-Bit)
55
wengeezhang

Unicode ist ein ziemlich komplexer Standard. Fürchte dich nicht, aber sei bereit für etwas Arbeit! [2]

Da eine glaubwürdige Ressource immer benötigt wird, der offizielle Bericht jedoch massiv ist, schlage ich vor, Folgendes zu lesen:

  1. Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!) Eine Einführung von Joel Spolsky, Stack Exchange-CEO.
  2. Zum BMP und darüber hinaus! Ein Tutorial von Eric Muller, Technischer Direktor, später Vizepräsident des Unicode-Konsortiums. (die ersten 20 Folien und du bist fertig)

Eine kurze Erklärung:

Computer lesen Bytes und Menschen lesen Zeichen, daher verwenden wir encoding standards, um Zeichen Bytes zuzuordnen. ASCII war der erste weit verbreitete Standard, deckt jedoch nur Latein ab (7 Bits/Zeichen können 128 verschiedene Zeichen darstellen). Unicode ist ein Standard mit dem Ziel, alle möglichen Zeichen der Welt abzudecken (kann bis zu 1.114.112 Zeichen enthalten, dh maximal 21 Bit/Zeichen. In Unicode 8.0 sind insgesamt 120.737 Zeichen angegeben, und das ist alles).

Der Hauptunterschied besteht darin, dass ein Zeichen ASCII zu einem Byte (8 Bit) passen kann, die meisten Unicode-Zeichen jedoch nicht. Es werden also Kodierungsformulare/Schemata (wie UTF-8 und UTF-16) verwendet, und das Zeichenmodell sieht folgendermaßen aus:

Jedes Zeichen enthält eine Aufzählungsposition zwischen 0 und 1.114.111 (Hex: 0-10FFFF), die Codestelle heißt.
Ein Kodierungsformular ordnet einen Codepunkt einer Codeeinheitssequenz zu. Eine Code-Einheit ist die Art und Weise, in der Zeichen im Speicher organisiert werden sollen, 8-Bit-Einheiten, 16-Bit-Einheiten usw. UTF-8 verwendet 1 bis 4 Einheiten mit 8 Bit und UTF-16 verwendet 1 oder 2 Einheiten mit 16 Bit, um den gesamten Unicode von maximal 21 Bit abzudecken. Einheiten verwenden Präfixe, damit Zeichengrenzen erkannt werden können, und mehr Einheiten bedeuten mehr Präfixe, die Bits belegen. UTF-8 benötigt zwar 1 Byte für das lateinische Skript, benötigt jedoch 3 Byte für spätere Skripts in Basic Multilingual Plane, während UTF-16 für all diese Werte 2 Byte benötigt. Und das ist der Hauptunterschied. 
Schließlich bildet ein Codierungsschema (wie UTF-16BE oder UTF-16LE) eine Code-Unit-Sequenz (serialisiert) auf eine Byte-Sequenz.

zeichen: π
Codestelle: U + 03C0
Kodierungsformulare (Codeeinheiten):
UTF-8: CF 80
UTF-16: 03C0
Kodierungsschemata (Bytes): 
UTF-8: CF 80 
UTF-16BE: 03 C0 
UTF-16LE: C0 03

Tipp: Eine Hex-Ziffer steht für 4 Bits, eine zweistellige Hex-Zahl für ein Byte
Sehen Sie sich auch Plane-Karten in Wikipedia an, um ein Gefühl für das Zeichensatzlayout zu erhalten

25
Neuron

Ursprünglich sollte Unicode eine 16-Bit-Kodierung mit fester Breite (UCS-2) haben. Frühe Anwender von Unicode, wie Java und Windows NT, bauten ihre Bibliotheken auf 16-Bit-Strings auf.

Später wurde der Geltungsbereich von Unicode um historische Zeichen erweitert, was mehr als die 65.536 Codepunkte erfordern würde, die eine 16-Bit-Codierung unterstützen würde. Damit die zusätzlichen Zeichen auf Plattformen dargestellt werden können, auf denen UCS-2 verwendet wurde, wurde die UTF-16-Kodierung eingeführt. Es verwendet "Ersatzpaare", um Zeichen in den zusätzlichen Ebenen darzustellen.

Inzwischen verwendeten viele ältere Software- und Netzwerkprotokolle 8-Bit-Strings. UTF-8 wurde entwickelt, damit diese Systeme Unicode unterstützen können, ohne breite Zeichen verwenden zu müssen. Es ist abwärtskompatibel mit 7-Bit-ASCII.

18
dan04

Dieser Artikel beschreibt alle Details http://kunststube.net/encoding/

SCHREIBEN IN PUFFER

wenn Sie in einen 4-Byte-Puffer schreiben, Symbol mit UTF8-Kodierung, sieht Ihre Binärdatei folgendermaßen aus:

00000000 11100011 10000001 10000010

wenn Sie in einen 4-Byte-Puffer schreiben, Symbol mit UTF16-Kodierung, sieht Ihre Binärdatei folgendermaßen aus:

00000000 00000000 00110000 01000010

Wie Sie sehen, wird sich dies je nach der Sprache, die Sie in Ihrem Inhalt verwenden würden, entsprechend auf Ihr Gedächtnis auswirken.

z.B. Für dieses bestimmte Symbol gilt: Die UTF16-Codierung ist effizienter, da für das nächste Symbol 2 Ersatzbytes zur Verfügung stehen. Das bedeutet jedoch nicht, dass Sie UTF16 für japanisches Alphabet verwenden müssen.

LESEN VOM PUFFER

Wenn Sie nun die obigen Bytes lesen möchten, müssen Sie wissen, in welche Kodierung geschrieben wurde, und sie korrekt wieder dekodieren.

z.B. Wenn Sie dies entschlüsseln: 00000000 11100011 10000001 10000010 .__ in die UTF16-Kodierung, Sie erhalten am Ende und nicht

Hinweis: Kodierung und Unicode sind zwei verschiedene Dinge. Unicode ist die große (Tabelle) wobei jedes Symbol einem eindeutigen Codepunkt zugeordnet ist. z.B. Das -Symbol (Buchstabe) hat einen (Codepunkt) : 30 42 (Hex). Die Kodierung hingegen ist ein Algorithmus, der Symbole beim Speichern auf Hardware in 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.

 enter image description here

11
InGeek

Warum Unicode? Weil ASCII nur 127 Zeichen hat. Die von 128 bis 255 unterscheiden sich in den verschiedenen Ländern, daher gibt es Codepages. Sie sagten also, wir könnten bis zu 1114111 Zeichen haben. Wie speichert man also den höchsten Codepunkt? Sie müssen es mit 21 Bit speichern, so dass Sie ein DWORD mit 32 Bit und 11 Bit verwenden. Wenn Sie ein DWORD zum Speichern eines Unicode-Zeichens verwenden, ist dies der einfachste Weg, da der Wert in Ihrem DWORD genau mit dem Codepunkt übereinstimmt. DWORD-Arrays sind jedoch natürlich größer als Word-Arrays und natürlich noch größer als BYTE-Arrays. Deshalb gibt es nicht nur utf-32, sondern auch utf-16. Aber utf-16 bedeutet einen Word-Stream, und ein Word hat 16 Bits. Wie kann also der höchste Codepunkt 1114111 in ein WORD passen? Es kann nicht! Also steckten sie alles über 65535 in ein DWORD, das sie als Ersatzpaar bezeichnen. Ein solches Ersatzpaar besteht aus zwei Wörtern und kann durch Betrachten der ersten 6 Bits erkannt werden. Was ist mit utf-8? Es ist ein Byte-Array oder ein Byte-Stream, aber wie kann der höchste Codepunkt 1114111 in ein Byte passen? Es kann nicht! Okay, also haben sie auch eine DWORD eingetragen, oder? Oder vielleicht ein Wort, oder? Fast richtig! Sie erfanden utf-8-Sequenzen, was bedeutet, dass jeder Codepunkt, der höher als 127 ist, in eine 2-Byte-, 3-Byte- oder 4-Byte-Sequenz codiert werden muss. Beeindruckend! Aber wie können wir solche Sequenzen erkennen? Nun, alles bis 127 ist ASCII und ist ein einzelnes Byte. Was mit 110 beginnt, ist eine Zwei-Byte-Sequenz, was mit 1110 beginnt, ist eine Drei-Byte-Sequenz und was mit 11110 beginnt, ist eine Vier-Byte-Sequenz. Die restlichen Bits dieser sogenannten "Startbytes" gehören zum Codepunkt. Abhängig von der Reihenfolge müssen nun folgende Bytes folgen. Ein nachfolgendes Byte beginnt mit 10, die restlichen Bits sind 6 Bit Nutzdaten und gehören zum Codepunkt. Verketten Sie die Nutzdatenbits des Startbytes und der folgenden Bytes/s, und Sie haben den Codepunkt. Das ist der Zauber von utf-8. 

8
brighty

Unicode ist ein Standard, der die Zeichen in allen Sprachen einem bestimmten numerischen Wert namens Code Points zuordnet. Der Grund dafür ist, dass unterschiedliche Codierungen möglich sind, wenn derselbe Satz von Codepunkten verwendet wird.

UTF-8 und UTF-16 sind zwei solche Kodierungen. Sie nehmen Codepunkte als Eingabe und codieren sie mit einer gut definierten Formel, um die codierte Zeichenfolge zu erzeugen.

Die Wahl einer bestimmten Kodierung hängt von Ihren Anforderungen ab. Unterschiedliche Kodierungen haben unterschiedliche Speicheranforderungen. Abhängig von den Zeichen, mit denen Sie sich befassen, sollten Sie die Kodierung wählen, bei der die kleinsten Bytefolgen zum Kodieren dieser Zeichen verwendet werden.

Weitere Informationen zu Unicode, UTF-8 und UTF-16 finden Sie in diesem Artikel.

Was jeder Programmierer über Unicode wissen sollte

7
Kishu Agarwal

UTF steht für Unicode Transformation Format (Unicode Transformation Format). In der heutigen Welt gibt es Skripte, die in Hunderten von anderen Sprachen geschrieben sind. Formate, die nicht unter das zuvor verwendete grundlegende ASCII fallen. Daher entstand UTF.

UTF-8 verfügt über Zeichenkodierungsfunktionen und seine Codeeinheit ist 8 Bit, während es für UTF-16 16 Bit ist. 

2
kg11

ASCII - Software reserviert für ein bestimmtes Zeichen nur 8 Bit im Speicher. Es funktioniert gut für englische und adoptierte Zeichen (Lehnwörter wie Fassadenzeichen), da die entsprechenden Dezimalwerte im Dezimalwert unter 128 fallen. Beispiel C Programm.

UTF-8 - Die Software weist 1 bis 4 variable 8-Bit-Bytes für ein bestimmtes Zeichen zu. Was bedeutet hier Variable? Angenommen, Sie senden das Zeichen 'A' über Ihre HTML-Seiten im Browser (HTML ist UTF-8). Der entsprechende Dezimalwert von A ist 65. Wenn Sie ihn in Dezimalzahlen konvertieren, wird er zu 01000010. Dies erfordert nur 1 Byte Ein 1-Byte-Speicher wird auch für spezielle, angenommene englische Zeichen wie 'ç' in einer Word-Fassade zugewiesen. Wenn Sie jedoch europäische Zeichen speichern möchten, sind 2 Byte erforderlich. Daher benötigen Sie UTF-8. Wenn Sie sich für asiatische Zeichen entscheiden, benötigen Sie jedoch mindestens 2 Byte und maximal 4 Byte. Ebenso benötigt Emoji 3 bis 4 Bytes. UTF-8 löst alle Ihre Anforderungen.

UTF-16 weist mindestens 2 Byte und maximal 4 Byte pro Zeichen zu, es werden keine 1 oder 3 Byte zugewiesen. Jedes Zeichen wird entweder in 16 oder 32 Bit dargestellt.

Warum gibt es dann UTF-16? Ursprünglich war Unicode 16 Bit und nicht 8 Bit. Java hat die ursprüngliche Version von UTF-16 übernommen.

Kurz gesagt, Sie brauchen UTF-16 nirgendwo, es sei denn, es wurde bereits von der Sprache oder Plattform übernommen, an der Sie gerade arbeiten.

Von Webbrowsern aufgerufenes Java-Programm verwendet UTF-16, der Webbrowser sendet jedoch Zeichen mit UTF-8.

0
Siva