Ich habe widersprüchliche Meinungen von Menschen gehört - laut der Wikipedia UTF-8- Seite.
Sie sind dasselbe, nicht wahr? Kann jemand klarstellen?
unicode
encoding
utf-8
character-encoding
terminology
Sarsnake
quelle
quelle
Antworten:
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.
quelle
0x04000000
bis gibt0x7FFFFFFF
, oder binär1111110v 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 .Lassen Sie mich dieses Beispiel anhand eines Beispiels veranschaulichen:
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
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:
Schreiben Sie das Ergebnis in eine Zeile:
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
PS Wenn Sie dieses Thema in Python lernen möchten, klicken Sie hier
quelle
0
das Zeichen durch 1 Biss (das aktuelle) dargestellt. Wenn das Byte mit beginnt,110
wird das Zeichen durch 2 Bytes (das aktuelle und das nächste) dargestellt. verbleibende Bits nach10
)), wenn Byte mit beginnt,1110
wird das Zeichen durch 3 Bytes, das aktuelle und die nächsten 2 Bytes (verbleibende Bits nach10
) dargestellt."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:
quelle
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.
quelle
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.
quelle
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)
quelle
http://www.wikiwand.com/en/UTF-8#/Description
Schauen Sie sich die erste Reihe an.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 .
quelle
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
dieCodierung 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 .
quelle
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:
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.
quelle
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? ... "
quelle
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.
quelle
Nein, das sind sie nicht.
Ich denke, der erste Satz der Wikipedia-Seite, auf die Sie verwiesen haben, gibt eine schöne, kurze Zusammenfassung:
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 .
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 .
quelle
Wenn ich zusammenfassen darf, was ich aus diesem Thread gesammelt habe:
Unicode 'übersetzt' Zeichen in Ordnungszahlen (in Dezimalform) .
UTF-8 ist eine Codierung, die diese Zahlen in binäre Darstellungen "übersetzt" .
Beachten Sie, dass es sich um die binäre Darstellung von 224 handelt, nicht um die binäre Form 0b11100000.
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
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.
quelle