Was ist die Basis für Unicode und warum wird UTF-8 oder UTF-16 benötigt? Ich habe dies bei Google recherchiert und auch hier gesucht, aber es ist mir nicht klar.
In VSS wird beim Durchführen eines Dateivergleichs manchmal die Meldung angezeigt, dass die beiden Dateien unterschiedliche UTFs haben. Warum sollte das so sein?
Bitte erklären Sie in einfachen Worten.
Antworten:
Warum brauchen wir Unicode?
In den (nicht zu) 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 ungewöhnlich, Englisch, العربية, 汉语, עִבְרִית, ελληνικά und ភាសាខ្មែរ 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 mag für den Benutzer Joe in Ordnung sein, für den Softwareentwickler Joe jedoch nicht . Ungefähr die Hälfte der Welt verwendet nicht-lateinische Zeichen, und die Verwendung von ASCII ist für diese Menschen wohl rücksichtslos. Darüber hinaus schließt er seine Software für eine große und wachsende Wirtschaft aus.
Daher wird ein umfassender Zeichensatz mit allen Sprachen benötigt. 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 Sätzen 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 einer Region, die als Basic Multilingual Plane (BMP) bezeichnet wird, nur durch zwei Bytes dargestellt werden . Jetzt ist eine Zeichenkodierung erforderlich, um auf diesen Zeichensatz zuzugreifen, und wenn die Frage gestellt wird, werde ich mich auf UTF-8 und UTF-16 konzentrieren.
Überlegungen zum Speicher
Wie viele Bytes geben Zugriff auf welche Zeichen in diesen Codierungen?
Es ist jetzt erwähnenswert, dass Zeichen, die nicht im BMP enthalten sind, alte Skripte, mathematische Symbole, Musiksymbole und seltenere chinesische / japanische / koreanische (CJK) Zeichen enthalten.
Wenn Sie hauptsächlich mit ASCII-Zeichen arbeiten, ist UTF-8 sicherlich speichereffizienter. Wenn Sie jedoch hauptsächlich mit außereuropäischen Skripten arbeiten, kann die Verwendung von UTF-8 bis zu 1,5-mal weniger speichereffizient sein als UTF-16. 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 für praktische Anwendungen fort.
1
einen Konflikt mit den ASCII-Zeichen vermeiden.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 Informationen zu diesen Codierungen finden Sie in den UTF-FAQ .
Praktische Überlegungen zur Programmierung
Zeichen- und Zeichenfolgendatentypen: Wie werden sie in der Programmiersprache codiert? Wenn es sich um Rohbytes handelt, können in dem Moment, in dem Sie versuchen, Nicht-ASCII-Zeichen auszugeben, einige Probleme auftreten. Auch wenn der Zeichentyp auf einer UTF basiert, bedeutet dies nicht, dass die Zeichenfolgen die richtige UTF sind. Sie können unzulässige Byte-Sequenzen zulassen. Im Allgemeinen müssen Sie eine Bibliothek verwenden, die UTF unterstützt, z. B. ICU für C, C ++ und Java. Wenn Sie etwas anderes als die Standardcodierung eingeben / ausgeben möchten, müssen Sie es in jedem Fall zuerst konvertieren.
Empfohlene / Standard- / dominante Codierungen: Wenn Sie die Wahl haben, welches UTF verwendet werden soll, ist es normalerweise am besten, die empfohlenen Standards für die Umgebung zu befolgen, in der Sie arbeiten. Beispielsweise ist UTF-8 im Web dominant und seit HTML5 wurde die empfohlene Kodierung . 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 normalerweise auf die dominante UTF-Codierung in einer bestimmten Umgebung 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 auftreten können. Allerdings unterstützen nicht alle angeblichen UTF-16-Bibliotheken Ersatzpaare ordnungsgemäß, da sie sehr selten auftreten.
Zeichen zählen: In Unicode gibt es Kombinationszeichen . Beispielsweise 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 2 für das erste Beispiel und 1 für das letztere zurück. Dies ist nicht unbedingt falsch, kann aber auch nicht das gewünschte Ergebnis sein.
Vergleich für Gleichheit: A, А und Α sehen gleich aus, aber sie sind lateinisch, kyrillisch und griechisch. Sie haben auch Fälle wie C und Ⅽ, einer ist ein Buchstabe, der andere eine römische Ziffer. Darüber hinaus müssen wir auch die kombinierenden Zeichen berücksichtigen. Weitere Informationen finden Sie unter Doppelte Zeichen in Unicode .
Ersatzpaare: Diese kommen bei SO häufig genug vor, daher werde ich nur einige Beispiellinks bereitstellen:
Andere?:
quelle
quelle
Da immer eine glaubwürdige Ressource benötigt wird, der offizielle Bericht jedoch umfangreich ist, empfehle ich Folgendes zu lesen:
Eine kurze Erklärung:
Computer lesen Bytes und Menschen lesen Zeichen. Daher verwenden wir Codierungsstandards , um Zeichen Bytes zuzuordnen. ASCII war der erste weit verbreitete Standard, deckt jedoch nur Latein ab (7 Bit / Zeichen können 128 verschiedene Zeichen darstellen). Unicode ist ein Standard mit dem Ziel, alle möglichen Zeichen auf der Welt abzudecken (kann bis zu 1.114.112 Zeichen enthalten, dh maximal 21 Bit / Zeichen. Der aktuelle Unicode 8.0 spezifiziert insgesamt 120.737 Zeichen, und das ist alles).
Der Hauptunterschied besteht darin, dass ein ASCII-Zeichen in ein Byte (8 Bit) passen kann, die meisten Unicode-Zeichen jedoch nicht. Daher werden Codierungsformen / -schemata (wie UTF-8 und UTF-16) verwendet, und das Zeichenmodell sieht folgendermaßen aus:
Jedes Zeichen hat eine Aufzählungsposition von 0 bis 1.114.111 (hex: 0-10FFFF), die als Codepunkt bezeichnet wird .
Ein Codierungsformular ordnet einen Codepunkt einer Codeeinheitssequenz zu. Eine Codeeinheit ist die Art und Weise, wie 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 mit maximal 21 Bit abzudecken. Einheiten verwenden Präfixe, damit Zeichengrenzen erkannt werden können, und mehr Einheiten bedeuten mehr Präfixe, die Bits belegen. Obwohl UTF-8 1 Byte für das lateinische Skript verwendet, benötigt es 3 Bytes für spätere Skripte in der mehrsprachigen Basisebene, während UTF-16 für all diese Skripte 2 Byte verwendet. Und das ist ihr Hauptunterschied.
Zuletzt ein Kodierungsschema (wie UTF-16BE oder UTF-16LE) ordnet (serialisiert) eine Codeeinheitssequenz einer Bytesequenz zu.
Zeichen: π
Codepunkt: U + 03C0-
Codierungsformen (Codeeinheiten):
UTF-8: CF 80
UTF-16: 03C0-
Codierungsschemata (Bytes):
UTF-8: CF 80
UTF-16BE: 03 C0
UTF-16LE: C0 03
Tipp: Eine hexadezimale Ziffer steht für 4 Bit, eine zweistellige hexadezimale Zahl für ein Byte.
Schauen Sie sich auch die Flugzeugkarten in Wikipedia an, um ein Gefühl für das Zeichensatzlayout zu bekommen
quelle
Ursprünglich sollte Unicode eine 16-Bit-Codierung mit fester Breite (UCS-2) haben. Frühe Anwender von Unicode wie Java und Windows NT bauten ihre Bibliotheken auf 16-Bit-Zeichenfolgen auf.
Später wurde der Umfang von Unicode um historische Zeichen erweitert, für die mehr als die 65.536 Codepunkte erforderlich wären, 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-Codierung eingeführt. Es verwendet "Ersatzpaare", um Zeichen in den zusätzlichen Ebenen darzustellen.
In der Zwischenzeit verwendeten viele ältere Software- und Netzwerkprotokolle 8-Bit-Zeichenfolgen. 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.
quelle
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.quelle
Unicode ist ein Standard, der die Zeichen in allen Sprachen einem bestimmten numerischen Wert zuordnet, der als Codepunkte bezeichnet wird . Der Grund dafür ist, dass unterschiedliche Codierungen mit demselben Satz von Codepunkten möglich sind.
UTF-8 und UTF-16 sind zwei solche Codierungen. Sie nehmen Codepunkte als Eingabe und codieren sie mit einer genau definierten Formel, um die codierte Zeichenfolge zu erzeugen.
Die Auswahl einer bestimmten Codierung hängt von Ihren Anforderungen ab. Unterschiedliche Codierungen haben unterschiedliche Speicheranforderungen. Abhängig von den Zeichen, mit denen Sie sich befassen, sollten Sie die Codierung auswählen, die die geringsten Folgen von Bytes zum Codieren dieser Zeichen verwendet.
Weitere Informationen zu Unicode, UTF-8 und UTF-16 finden Sie in diesem Artikel.
Was jeder Programmierer über Unicode wissen sollte
quelle
Warum Unicode? Weil ASCII nur 127 Zeichen hat. Die von 128 bis 255 unterscheiden sich in verschiedenen Ländern, deshalb gibt es Codepages. Sie sagten also, wir könnten bis zu 1114111 Zeichen haben. Wie speichert man den höchsten Codepunkt? Sie müssen es mit 21 Bit speichern, also verwenden Sie ein DWORD mit 32 Bit, wobei 11 Bit verschwendet werden. Wenn Sie also ein DWORD zum Speichern eines Unicode-Zeichens verwenden, ist dies der einfachste Weg, da der Wert in Ihrem DWORD genau mit dem Codepunkt übereinstimmt. Aber DWORD-Arrays sind natürlich größer als WORD-Arrays und natürlich sogar 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 setzen sie alles, was höher als 65535 ist, in ein DWORD, das sie als Ersatzpaar bezeichnen. Ein solches Ersatzpaar besteht aus zwei WORTEN und kann durch Betrachten der ersten 6 Bits erkannt werden. Was ist also 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 ein DWORD eingegeben, oder? Oder vielleicht ein WORT, oder? Fast richtig! Sie haben utf-8-Sequenzen erfunden, was bedeutet, dass jeder Codepunkt höher als 127 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 zu 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. Nun müssen je nach Reihenfolge folgende Bytes folgen. Ein nachfolgendes Byte beginnt mit 10, Die verbleibenden Bits sind 6 Bits Nutzlastbits und gehören zum Codepunkt. Verketten Sie die Nutzdatenbits des Startbytes und der folgenden Bytes, und Sie erhalten den Codepunkt. Das ist die ganze Magie von utf-8.
quelle
ASCII - Die Software weist einem bestimmten Zeichen nur 8-Bit-Byte im Speicher zu. Es funktioniert gut für englische und übernommene (Lehnwörter wie Fassaden) Zeichen, da die entsprechenden Dezimalwerte im Dezimalwert unter 128 fallen. Beispiel C Programm.
UTF-8 - Die Software weist einem bestimmten Zeichen 1 bis 4 variable 8-Bit-Bytes 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 eine Dezimalzahl konvertieren, wird er zu 01000010. Dies erfordert nur 1 Byte 1 Byte Speicher wird auch für spezielle englische Zeichen wie 'ç' in einer Wortfassade zugewiesen. Wenn Sie jedoch europäische Zeichen speichern möchten, sind 2 Byte erforderlich, sodass Sie UTF-8 benötigen. Wenn Sie sich jedoch für asiatische Zeichen entscheiden, benötigen Sie mindestens 2 Byte und höchstens 4 Byte. Ebenso benötigen Emojis 3 bis 4 Bytes. UTF-8 wird alle Ihre Bedürfnisse lösen.
UTF-16 weist mindestens 2 Bytes und höchstens 4 Bytes pro Zeichen zu. Es werden keine 1 oder 3 Bytes zugewiesen. Jedes Zeichen wird entweder in 16 Bit oder 32 Bit dargestellt.
Warum gibt es dann UTF-16? Ursprünglich war Unicode 16 Bit, nicht 8 Bit. Java hat die ursprüngliche Version von UTF-16 übernommen.
Kurz gesagt, Sie benötigen UTF-16 nirgendwo, es sei denn, es wurde bereits von der Sprache oder Plattform übernommen, an der Sie arbeiten.
Von Webbrowsern aufgerufene Java-Programme verwenden UTF-16, aber der Webbrowser sendet Zeichen mit UTF-8.
quelle
UTF steht für Unicode Transformation Format. Grundsätzlich gibt es in der heutigen Welt Skripte, die in Hunderten anderer Sprachen geschrieben sind, Formate, die nicht durch das zuvor verwendete grundlegende ASCII abgedeckt sind. Daher entstand UTF.
UTF-8 verfügt über Zeichencodierungsfunktionen und seine Codeeinheit beträgt 8 Bit, während die für UTF-16 16 Bit beträgt.
quelle