487 Stimmen

Was sind Unicode, UTF-8 und UTF-16?

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

Sur VSS Wenn Sie einen Dateivergleich durchführen, erscheint manchmal die Meldung, dass die beiden Dateien unterschiedliche UTFs haben. Warum sollte dies der Fall sein?

Bitte erklären Sie das in einfachen Worten.

13voto

Kishu Agarwal Punkte 348

Unicode ist ein Standard, der die Zeichen in allen Sprachen einem bestimmten numerischen Wert zuordnet, der als Codepunkt . Der Grund dafür ist, dass verschiedene Kodierungen mit demselben Satz von Codepunkten möglich sind.

UTF-8 und UTF-16 sind zwei dieser Kodierungen. Sie nehmen Codepunkte als Eingabe und kodieren sie mit einer wohldefinierten Formel, um die kodierte Zeichenfolge zu erzeugen.

Die Wahl einer bestimmten Kodierung hängt von Ihren Anforderungen ab. Verschiedene Kodierungen haben unterschiedliche Speicheranforderungen, und je nach den Zeichen, mit denen Sie zu tun haben werden, sollten Sie die Kodierung wählen, die die wenigsten Bytes zur Kodierung dieser Zeichen benötigt.

Ausführlichere Informationen über Unicode, UTF-8 und UTF-16 finden Sie in diesem Artikel,

Was jeder Programmierer über Unicode wissen sollte

10voto

brighty Punkte 376

Warum Unicode? Weil ASCII nur 127 Zeichen hat. Die Zeichen von 128 bis 255 sind in den verschiedenen Ländern unterschiedlich, und deshalb gibt es Codepages. Sie sagten also: Lasst uns bis zu 1114111 Zeichen haben.

Wie speichern Sie also den höchsten Codepunkt? Sie müssen ihn mit 21 Bits speichern, also verwenden Sie ein DWORD mit 32 Bits, wobei 11 Bits verschwendet werden. Wenn Sie also ein DWORD verwenden, um ein Unicode-Zeichen zu speichern, ist dies der einfachste Weg, da der Wert in Ihrem DWORD genau dem Codepunkt entspricht.

Aber DWORD-Arrays sind 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? Das kann er nicht!

Also packen sie alles, was höher als 65535 ist, in ein DWORD, das sie Surrogat-Paar nennen. Ein solches Surrogat-Paar sind zwei WÖRTER und können anhand der ersten 6 Bits erkannt werden.

Und was ist mit UTF-8? Es ist ein Byte-Array oder Byte-Stream, aber wie kann der höchste Codepunkt 1114111 in ein Byte passen? Das kann nicht sein! Okay, also wird auch ein DWORD eingefügt, richtig? Oder vielleicht ein WORD, richtig? 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 kodiert werden muss. Wahnsinn! Aber wie können wir solche Sequenzen erkennen? Nun, alles bis 127 ist ASCII und besteht aus einem einzigen 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 so genannten "Startbytes" gehören zum Codepunkt.

Je nach Reihenfolge müssen nun folgende Bytes folgen. Ein Folgebyte beginnt mit 10, und die restlichen Bits sind 6 Bits Nutzdatenbits und gehören zum Codepunkt. Verketten Sie die Nutzdatenbits des Startbytes und des/der folgenden Bytes und Sie haben den Codepunkt. Das ist die ganze Magie von UTF-8.

8voto

Siva Punkte 169

ASCII - Die Software weist einem bestimmten Zeichen nur 8-Bit-Byte im Speicher zu. Es funktioniert gut für Englisch und übernommene (Lehnwörter wie Fassade ) Zeichen, da ihre entsprechenden Dezimalwerte unter 128 im Dezimalwert fallen. Beispiel C-Programm.

UTF-8 - Die Software weist ein bis vier variable 8-Bit-Bytes für ein bestimmtes Zeichen zu. Was ist hier mit einer Variable gemeint? Nehmen wir an, 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 Dezimalwerte umwandeln, wird daraus 01000010. Dafür wird nur ein Byte benötigt, und ein Byte Speicherplatz wird auch für spezielle englische Zeichen wie 'ç' in dem Wort Fassade . Wenn Sie jedoch europäische Zeichen speichern wollen, werden zwei Bytes benötigt, so dass Sie UTF-8 benötigen. Wenn Sie jedoch asiatische Zeichen speichern wollen, benötigen Sie mindestens zwei und höchstens vier Bytes. Ähnlich verhält es sich mit Emojis, die drei bis vier Bytes benötigen. UTF-8 wird alle Ihre Anforderungen erfüllen.

UTF-16 weist jedem Zeichen mindestens 2 und höchstens 4 Byte zu; 1 oder 3 Byte werden nicht zugewiesen. Jedes Zeichen wird entweder in 16 Bit 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, an der Sie arbeiten, übernommen.

Java-Programme, die von Webbrowsern aufgerufen werden, verwenden UTF-16, aber der Webbrowser sendet Zeichen in UTF-8.

3voto

Krishna Ganeriwal Punkte 1743

UTF steht für steht für Unicode-Transformationsformat . Grundsätzlich gibt es in der heutigen Welt Skripte in Hunderten von anderen Sprachen und Formaten, die nicht durch das früher verwendete ASCII abgedeckt sind. Daher wurde UTF ins Leben gerufen.

UTF-8 kann Zeichen kodieren und hat eine Codeeinheit von acht Bit, während UTF-16 16 Bit hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X