Ich bin ein bisschen verwirrt über Codierungen. Soweit ich weiß, haben alte ASCII-Zeichen ein Byte pro Zeichen benötigt. Wie viele Bytes benötigt ein Unicode-Zeichen?
Ich gehe davon aus, dass ein Unicode-Zeichen jedes mögliche Zeichen aus einer beliebigen Sprache enthalten kann - bin ich richtig? Wie viele Bytes benötigt es pro Zeichen?
Und was bedeuten UTF-7, UTF-6, UTF-16 usw.? Sind sie verschiedene Versionen von Unicode?
Ich habe den Wikipedia-Artikel über Unicode gelesen, aber es ist ziemlich schwierig für mich. Ich freue mich auf eine einfache Antwort.
Antworten:
Sie werden keine einfache Antwort sehen, weil es keine gibt.
Erstens enthält Unicode nicht "jedes Zeichen aus jeder Sprache", obwohl es dies sicher versucht.
Unicode selbst ist eine Zuordnung, es definiert Codepunkte und ein Codepunkt ist eine Zahl, die normalerweise einem Zeichen zugeordnet ist. Ich sage normalerweise, weil es Konzepte wie das Kombinieren von Zeichen gibt. Sie kennen möglicherweise Dinge wie Akzente oder Umlaute. Diese können mit einem anderen Zeichen verwendet werden, z. B. einem
a
oder einemu
, um ein neues logisches Zeichen zu erstellen. Ein Zeichen kann daher aus einem oder mehreren Codepunkten bestehen.Um in Computersystemen nützlich zu sein, müssen wir eine Darstellung für diese Informationen auswählen. Dies sind die verschiedenen Unicode-Codierungen wie utf-8, utf-16le, utf-32 usw. Sie unterscheiden sich weitgehend durch die Größe ihrer Codeeinheiten. UTF-32 ist die einfachste Codierung. Es hat eine Codeeinheit mit 32 Bit, was bedeutet, dass ein einzelner Codepunkt bequem in eine Codeeinheit passt. Bei den anderen Codierungen treten Situationen auf, in denen ein Codepunkt mehrere Codeeinheiten benötigt oder dieser bestimmte Codepunkt in der Codierung überhaupt nicht dargestellt werden kann (dies ist beispielsweise bei UCS-2 ein Problem).
Aufgrund der Flexibilität beim Kombinieren von Zeichen kann die Anzahl der Bytes pro Zeichen selbst innerhalb einer bestimmten Codierung je nach Zeichen und Normalisierungsform variieren. Dies ist ein Protokoll für den Umgang mit Zeichen, die mehr als eine Darstellung haben (Sie können sagen,
"an 'a' with an accent"
dass es sich um 2 Codepunkte handelt, von denen einer ein Kombinationszeichen oder"accented 'a'"
ein Codepunkt ist).quelle
Seltsamerweise hat niemand darauf hingewiesen, wie zu berechnen ist, wie viele Bytes ein Unicode-Zeichen benötigt. Hier ist die Regel für UTF-8-codierte Zeichenfolgen:
Die schnelle Antwort lautet also: Es dauert 1 bis 4 Bytes, abhängig vom ersten, das angibt, wie viele Bytes es aufnehmen wird.
quelle
Ich weiß, dass diese Frage alt ist und bereits eine akzeptierte Antwort hat, aber ich möchte einige Beispiele anbieten (in der Hoffnung, dass sie für jemanden nützlich sein wird).
Richtig. Da es sich bei ASCII um eine 7-Bit-Codierung handelt, werden 128 Codes unterstützt (von denen 95 druckbar sind), sodass nur ein halbes Byte verwendet wird (sofern dies sinnvoll ist).
Unicode ordnet nur Zeichen Codepunkten zu. Es definiert nicht, wie sie codiert werden sollen. Eine Textdatei enthält keine Unicode-Zeichen, sondern Bytes / Oktette, die Unicode-Zeichen darstellen können.
Nein, aber fast. Also im Grunde ja. Aber immer noch nein.
Gleich wie deine 2. Frage.
Nein, das sind Kodierungen. Sie definieren, wie Bytes / Oktette Unicode-Zeichen darstellen sollen.
Ein paar Beispiele. Wenn einige davon nicht in Ihrem Browser angezeigt werden können (wahrscheinlich, weil die Schriftart sie nicht unterstützt), gehen Sie zu
http://codepoints.net/U+1F6AA
(durch1F6AA
den Codepunkt in Hex ersetzen ), um ein Bild anzuzeigen .a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
Okay, ich werde mitgerissen ...
Wissenswertes:
quelle
00A9
anstelle von00 A9
(was UTF-16BE wäre) sein.Einfach gesagt
Unicode
ist ein Standard, der allen Zeichen der Welt eine Nummer (Codepunkt genannt) zuweist (es ist noch in Arbeit).Jetzt müssen Sie diese Codepunkte mit Bytes darstellen, die aufgerufen werden
character encoding
.UTF-8, UTF-16, UTF-6
sind Möglichkeiten, diese Zeichen darzustellen.UTF-8
ist eine Multibyte-Zeichencodierung. Zeichen können 1 bis 6 Bytes haben (einige von ihnen sind derzeit möglicherweise nicht erforderlich).UTF-32
Jedes Zeichen hat 4 Bytes pro Zeichen.UTF-16
verwendet 16 Bit für jedes Zeichen und stellt nur einen Teil der Unicode-Zeichen dar, die als BMP bezeichnet werden (für alle praktischen Zwecke ist dies ausreichend). Java verwendet diese Codierung in seinen Zeichenfolgen.quelle
In UTF-8:
In UTF-16:
In UTF-32:
10FFFF ist per Definition der letzte Unicode-Codepunkt und wird auf diese Weise definiert, da es sich um das technische Limit von UTF-16 handelt.
Es ist auch der größte Codepunkt, den UTF-8 in 4 Byte codieren kann, aber die Idee hinter der Codierung von UTF-8 funktioniert auch für 5- und 6-Byte-Codierungen, um Codepunkte bis 7FFFFFFF abzudecken, d. H. die Hälfte von dem, was UTF-32 kann.
quelle
In Unicode ist die Antwort nicht einfach zu geben. Das Problem sind, wie Sie bereits betont haben, die Codierungen.
Bei jedem englischen Satz ohne diakritische Zeichen wäre die Antwort für UTF-8 so viele Bytes wie Zeichen und für UTF-16 wäre es die Anzahl der Zeichen mal zwei.
Die einzige Codierung, bei der wir (ab sofort) die Aussage über die Größe treffen können, ist UTF-32. Dort sind es immer 32 Bit pro Zeichen, obwohl ich mir vorstelle, dass Codepunkte für eine zukünftige UTF-64 vorbereitet sind :)
Was es so schwierig macht, sind mindestens zwei Dinge:
U+20AC
kann entweder als Drei-Byte- SequenzE2 82 AC
oder als Vier-Byte- Sequenz dargestellt werdenF0 82 82 AC
.quelle
In UTF-8 gibt es ein großartiges Tool zum Berechnen der Bytes einer Zeichenfolge: http://mothereff.in/byte-counter
Update: @mathias hat den Code veröffentlicht: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
quelle
Nun, ich habe gerade auch die Wikipedia-Seite darauf aufgerufen und im Intro-Teil gesehen, dass "Unicode durch verschiedene Zeichencodierungen implementiert werden kann. Die am häufigsten verwendeten Codierungen sind UTF-8 (das ein Byte für alle ASCII-Zeichen verwendet, die diese haben) die gleichen Codewerte sowohl in der UTF-8- als auch in der ASCII-Codierung und bis zu vier Bytes für andere Zeichen), das mittlerweile veraltete UCS-2 (das zwei Bytes für jedes Zeichen verwendet, aber nicht jedes Zeichen im aktuellen Unicode-Standard codieren kann) "
Wie dieses Zitat zeigt, besteht Ihr Problem darin, dass Sie davon ausgehen, dass Unicode eine einzige Methode zum Codieren von Zeichen ist. Es gibt tatsächlich mehrere Formen von Unicode, und auch in diesem Zitat hat eine von ihnen sogar 1 Byte pro Zeichen, genau wie Sie es gewohnt sind.
Ihre einfache Antwort, die Sie wollen, ist also, dass sie variiert.
quelle
Für UTF-16 benötigt das Zeichen vier Bytes (zwei Codeeinheiten), wenn es mit 0xD800 oder höher beginnt. Ein solches Zeichen wird als "Ersatzpaar" bezeichnet. Insbesondere hat ein Ersatzpaar die Form:
Dabei gibt [...] eine Zwei-Byte-Codeeinheit mit dem angegebenen Bereich an. Alles <= 0xD7FF ist eine Codeeinheit (zwei Bytes). Alles> = 0xE000 ist ungültig (außer wohl Stücklistenmarkierungen).
Siehe http://unicodebook.readthedocs.io/unicode_encodings.html , Abschnitt 7.5.
quelle
Schauen Sie sich diesen Unicode-Code-Konverter an . Geben Sie beispielsweise in das Feld "0x ... Notation" ein
0x2009
, wobei 2009 die Unicode-Nummer für Thin Space ist, und klicken Sie auf "Konvertieren". Die HexadezimalzahlE2 80 89
(3 Byte) wird im Feld "UTF-8-Codeeinheiten" angezeigt.quelle
Aus dem Wiki:
Dies sind die drei beliebtesten unterschiedlichen Codierungen.
quelle
Unicode
ist ein Standard, der für jedes Zeichen eine eindeutige Nummer bereitstellt. Diese eindeutigen Zahlen werdencode point
s (was nur ein eindeutiger Code ist) für alle auf der Welt vorhandenen Zeichen genannt (einige müssen noch hinzugefügt werden).Für verschiedene Zwecke müssen Sie dies möglicherweise
code points
in Bytes darstellen (die meisten Programmiersprachen tun dies), und hier setzt einCharacter Encoding
.UTF-8
,UTF-16
,UTF-32
Und so weiter sind alleCharacter Encodings
, und Unicode der Codepunkte werden in diesen Kodierungen, auf unterschiedliche Weise dargestellt.UTF-8
Die Codierung hat eine Länge variabler Breite, und die darin codierten Zeichen können 1 bis einschließlich 4 Bytes belegen.UTF-16
hat eine variable Länge und darin codierte Zeichen können entweder 1 oder 2 Bytes (8 oder 16 Bit) aufnehmen. Dies stellt nur einen Teil aller Unicode-Zeichen dar, die als BMP (Basic Multilingual Plane) bezeichnet werden, und reicht für fast alle Fälle aus. Java verwendet dieUTF-16
Codierung für seine Zeichenfolgen und Zeichen.UTF-32
hat eine feste Länge und jedes Zeichen benötigt genau 4 Bytes (32 Bit).quelle