Frage

Ich habe gehört, Meinungen von Menschen in Konflikt - nach dem Wikipedia UTF-8 Seite .

Sie sind die gleiche Sache, nicht wahr? Kann jemand erklären?

War es hilfreich?

Lösung

Zur Erweiterung auf die Antworten, die andere gegeben haben:

Wir haben viele Sprachen mit vielen Zeichen bekommen, dass Computer sollte im Idealfall Display. Unicode weist jedes Zeichen eine eindeutige Nummer, oder Codepunkt.

Computer beschäftigen sich mit solchen Zahlen wie Bytes ... ein bisschen Geschichte hier das Überspringen und ignoriert Speicheradressierung Probleme, 8-Bit-Computer leicht auf der Hardware, ein 8-Bit-Byte als die größte numerische Einheit 16-Bit dargestellt würden behandeln Computer erweitern würden, dass zwei Bytes, und so weiter.

Alte Zeichencodierungen wie ASCII sind aus der (Vor-) 8-Bit-Ära, und versuchen, die dominierende Sprache in Computing zu der Zeit zu stopfen, das heißt Englisch, in Zahlen von 0 bis 127 reichen (7 Bit). Mit 26 Buchstaben im Alphabet, die beide in der Hauptstadt und nicht-Kapital Form, Zahlen und Satzzeichen, die ziemlich gut funktioniert. ASCII wurde für andere, nicht-englische Sprachen durch ein achtes Bit erweitert, aber die zusätzlichen 128 Nummern / Codepunkte durch diese Erweiterung zur Verfügung gestellt würden, um verschiedene Zeichen abgebildet werden, abhängig von der Sprache angezeigt werden. Die ISO-8859-Standards sind die häufigsten Formen dieser Abbildung; ISO-8859-1 und ISO-8859-15 (auch bekannt als ISO-Latin-1, latin1, und ja, es gibt zwei verschiedene Versionen der 8859 ISO-Norm als auch).

Aber das ist nicht genug, wenn Sie wollen Zeichen darzustellen von mehr als einer Sprache, so alle verfügbaren Zeichen in ein einziges Byte pauken einfach nicht funktionieren.

Es gibt im Wesentlichen zwei verschiedene Arten von Codierungen: ein erweitert den Wertebereich von mehr Bits hinzugefügt wird. Beispiele für diese Codierungen würden UCS2 (2 Byte = 16 Bit) und UCS4 (4 Bytes = 32 Bits) sein. Sie leiden an von Natur aus dem gleichen Problem wie die ASCII und ISO-8859-Standards, dessen Wertebereich noch begrenzt ist, auch wenn die Grenze ist erheblich höher.

Die andere Art der Codierung verwendet eine variable Anzahl von Bytes pro Zeichen, und die am häufigsten bekannten Codierungen für diese sind die UTF-Codierungen. Alle UTF-Kodierungen arbeiten in etwa die gleiche Weise: Sie wählen eine Einheitsgröße, die für die UTF-8 8 Bit ist, für UTF-16 16 Bits ist, und für UTF-32 ist 32 Bit. Der Standard definiert dann einige dieser Bits als Flags: wenn sie gesetzt sind, dann wird die nächste Einheit in einer Folge von Einheiten Teil des gleichen Charakter betrachtet werden soll. Wenn sie nicht gesetzt sind, stellt dieses Gerät vollständig ein Zeichen. So sind die am häufigsten (Englisch) Zeichen nur ein Byte in UTF-8 belegen (zwei in UTF-16, 4 in UTF-32), aber auch andere Sprache Zeichen sechs Bytes belegen können oder mehr.

Multi-Byte-Codierung (soll ich sagen, Multi-Unit nach der obigen Erläuterung) habe den Vorteil, dass sie relativ platzsparende, aber den Nachteil, dass Vorgänge wie die Suche nach Teil, Vergleichen, usw. Sie alle haben, um die Zeichen zu dekodieren In den Unicode-Codepunkte vor solchen Operationen durchgeführt werden können (es gibt einige Abkürzungen, obwohl).

Sowohl die UCS-Standards und die UTF-Standards kodieren die Codepunkte wie in Unicode definiert. Theoretisch könnte diese Codierungen eine beliebige Anzahl zu codieren, verwendet werden (im Bereich der Codierung unterstützt) - aber natürlich diese Kodierungen wurden gemacht Unicode-Codepunkte zu kodieren. Und das ist Ihre Beziehung zwischen ihnen.

Windows übernimmt sogenannten "Unicode" Strings als UTF-16-Strings, während der meisten UNIX-Varianten standardmäßig auf UTF-8 in diesen Tagen. Kommunikationsprotokolle wie HTTP neigen dazu, am besten mit UTF-8 zu arbeiten, da die Größe des in UTF-8 ist die gleiche wie in ASCII, und die meisten dieser Protokolle wurden in der ASCII-Ära entworfen. Auf der anderen Seite, UTF-16 gibt die besten Durchschnitt Raum / Verarbeitungsleistung, wenn aus allen lebenden Sprachen.

Der Unicode-Standard definiert wenige Codepunkte, als in 32 Bits dargestellt werden. So für alle praktischen Zwecke, UTF-32 und UCS4 die gleiche Codierung wurden, wie Sie unwahrscheinlich sind, um mit Multi-Unit-Zeichen in UTF-32 zu behandeln.

Hope, die in einigen Details füllen.

Andere Tipps

„Unicode“ ist leider auf verschiedene Arten verwendet werden, je nach Kontext. Sein korrekter Gebrauch (IMO) als codierter Zeichensatz - d. H einen Satz von Zeichen und eine Zuordnung zwischen den Zeichen und integer Codepunkte sie repräsentierte

UTF-8 ist eine Zeichencodierung - ein Weg von Sequenzen von Bytes Umwandeln zu Sequenzen von Zeichen und umgekehrt. Er deckt den gesamten Unicode-Zeichensatz. ASCII als ein einziges Byte pro Zeichen codiert sind, und andere Zeichen mehr Bytes dauern, je nach ihrer genauen Codepunkt (bis zu 4 Byte für alle derzeit Codepunkten definiert, dh bis zu U-0010FFFF, und zwar 4 Bytes könnte mit bis zu bewältigen U-001FFFFF).

Wenn "Unicode" als Name einer Zeichencodierung (zB als .NET Encoding.Unicode Eigenschaft) bedeutet dies in der Regel UTF- 16 , die am häufigsten als Zeichen zwei Bytes codiert. Einige Plattformen (insbesondere .NET und Java) verwenden UTF-16 als „native“ Zeichencodierung. Dies führt zu Problemen behaart, wenn Sie Zeichen kümmern, die in einem einzigen UTF-16-Wert codiert wird, können nicht sein (sie sind als „Ersatzpaar“ codiert) - aber die meisten Entwickler nie Sorgen darüber, IME

Einige Referenzen auf Unicode:

Lassen Sie mich ein Beispiel verwenden, um dieses Thema zu veranschaulichen:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Im Moment magisch so weit, es ist sehr einfach. Nun lassen Sie uns sagen, dass wir diesen Charakter auf unserer Festplatte zu speichern, entscheiden. Um das zu tun, müssen wir die Zeichen im Binärformat speichern. Wir können es einfach speichern als ‚01101100 01001001‘ ist. Fertig!

Aber warten Sie eine Minute, ist ‚01101100 01001001‘ ein Zeichen oder zwei Zeichen? Sie wussten, dass dies ein Zeichen ist, weil ich dir gesagt habe, aber wenn ein Computer liest, hat sie keine Ahnung. Wir brauchen also eine Art „Codierung“, um den Computer zu sagen, es als eine zu behandeln.

Hier werden die Regeln von 'UTF-8' kommt in: http: / /www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Nach der obigen Tabelle, wenn wir diese Zeichen mit den ‚UTF-8‘ Format speichern wollen, müssen wir unseren Charakter mit einigen ‚Header‘ Präfix. Unsere chinesischen Zeichen ist 16 Bit lang (Anzahl der binären Wert selbst), so dass wir das Format auf Zeile 3 verwenden, da es genügend Platz bietet:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

das Ergebnis in einer Zeile Schreiben aus:

11100110 10110001 10001001

Dies ist der UTF-8 (binär) Wert des chinesischen Zeichens! (Bestätigen Sie es selbst: http://www.fileformat.info/info /unicode/char/6c49/index.htm )

Zusammenfassung

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P. S. Wenn Sie dieses Thema in Python lernen möchten, hier klicken

Sie sind nicht die gleiche Sache -. UTF-8 ist eine besondere Art und Weise Unicode der Codierung

Es gibt viele verschiedene Kodierungen Sie je nach Anwendung können wählen, und die Daten, die Sie verwenden möchten. Die häufigsten sind UTF-8, UTF-16 und UTF-32 s weit ich weiß.

Unicode nur definieren Codepunkte , das heißt, eine Zahl, die ein Zeichen darstellt. Wie Sie speichern diese Codepunkte im Speicher hängt von der Codierung , dass Sie verwenden. UTF-8 ist eine Möglichkeit, Unicode-Zeichen zu codieren, unter vielen anderen.

Unicode ist ein Standard, der zusammen mit ISO / IEC 10646, Universal Character Set (UCS) , die definiert, ist eine Obermenge aller vorhandenen Zeichen erforderlich praktisch alle vertreten bekannte Sprachen.

Unicode weist einen Namen und eine Nummer ( Zeichencode oder -Code-Punkt ) auf jedes Zeichen in seinem Repertoire.

UTF-8-Codierung , ist ein Weg, um diese Zeichen digital im Speicher des Computers zu repräsentieren. UTF-8 bildet jeden Codepunkt in eine Folge von Oktetten (8-Bit-Bytes)

z. B.

UCS Character = Unicode Han Charakter

UCS Code-Punkt = U + 24B62

UTF-8-Codierung = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

Die bestehenden Antworten bereits eine Menge von Details erklären, aber hier sind eine sehr kurze Antwort mit der direkteste Erklärung und Beispiel.

Unicode ist die Standard , in dem Zeichen Codepoints. Karten
Jedes Zeichen hat einen eindeutigen Codepunkt (Identifikationsnummer), die eine Zahl ist, wie 9731.

UTF-8 ist ein die Codierung der Codepoints.
Um alle Zeichen auf der Festplatte zu speichern (in einer Datei), teilt UTF-8-Zeichen in bis zu 4 Bytes (8-Bit-Sequenzen) - Byte. UTF-8 ist eine von mehreren Codierungen (Methoden der Daten darstellt). Zum Beispiel, in Unicode, das (dezimal) Codepunkt 9731 stellt einen Schneemann (), die in UTF-8 von 3 Bytes besteht: E2 98 83

Hier ist ein Liste sortiert mit einige zufällige Beispiele .

1. Unicode

Im moment gibt es viele Zeichen auf der ganzen Welt, wie "$, &, h, a, t,?, 张, 1, =, + ...".

Dann kommt eine Organisation, die diese Zeichen gewidmet ist,

Sie haben einen Standard namens "Unicode".

Der Standard ist wie folgt:

  • Erstellen Sie ein Formular, in dem jede Position "Codepunkt" oder "Codeposition" bezeichnet wird.
  • Die ganzen Positionen sind von U + 0000 bis U + 10FFFF;
  • Bis jetzt sind einige Positionen mit Zeichen gefüllt, und andere Positionen werden gespeichert oder leer.
  • Zum Beispiel kann die Position "U + 0024" mit dem Zeichen "$" gefüllt.

PS: Natürlich gibt es eine andere Organisation ISO Aufrechterhaltung anderen Standard genannt - "ISO 10646", fast die gleiche

.

2. UTF-8

Wie oben, U + 0024 ist nur eine Position, so können wir nicht "U + 0024" in Computer für das Zeichen "$" speichern.

Es muss ein Codierverfahren sein.

Dann kommen Codierverfahren, wie beispielsweise UTF-8, UTF-16, UTF-32, UCS-2 ....

Unter UTF-8, der Codepunkt "U + 0024" codiert in 00100100.

00100100 ist der Wert, den wir in dem Computer speichern für "$".

Ich habe die Links in Gumbo Antwort überprüft, und ich wollte hier einen Teil der Dinge einfügen als auch auf Stack-Überlauf existieren.

“... Einige Leute in der irrigen Annahme, die Unicode ist einfach ein 16-Bit-Code, in dem jedes Zeichen 16 Bits nimmt und daher gibt es 65.536 mögliche Zeichen. Das ist eigentlich nicht richtig. Es ist die häufigste Mythos über Unicode, also, wenn Sie dachten, dass, fühlen sich nicht schlecht.

In der Tat, Unicode hat eine andere Art und Weise über Zeichen des Denkens, und Sie müssen die Unicode-Denkweise der Dinge verstehen oder nichts Sinn machen.

Bisher haben wir angenommen, dass ein Brief Karten auf einige Bits, die Sie auf der Festplatte oder im Speicher ablegen können:

A -> 0100 0001

In Unicode, ein Brief Karten zu etwas einen Codepunkt genannt, die nach wie vor nur ein theoretisches Konzept. Wie das Codepunkt im internen Speicher oder auf der Festplatte dargestellt ist, ist eine ganz andere Geschichte ... "

“... Jeder platonisch Brief in jedes Alphabet eine magische Zahl vom Unicode-Konsortium zugeordnet ist, die so geschrieben wird. U + 0639 Diese magische Zahl ist ein Codepunkt genannt Das U + bedeutet.‚Unicode‘und die Zahlen hexadezimal sind. U + 0639 sind die arabischen Buchstaben Ain. der Brief Englisch A U + 0041 wäre .... "

“... OK, also sagen, wir haben einen String:

Hallo

, die in Unicode, entspricht diese fünf Codepunkte:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Gerade ein Bündel von Codepunkten. Zahlen, wirklich. Wir haben noch nicht gesagt etwas darüber, wie diese im Speicher zu speichern oder sie in einer E-Mail-Nachricht repräsentieren ... "

“... Das ist, wo Codierungen kommen.

Die früheste Idee für Unicode-Codierung, die den Mythos über die beiden Bytes führte, war, hey, sie speichert nur diese Zahlen in jeweils zwei Bytes. So Hallo wird

00 48 00 65 00 6C 00 6C 00 6F

Richtig? Nicht so schnell! Könnte es nicht sein, auch:

48 00 65 00 6C 00 6C 00 6F 00? ... "

Unicode ist ein Breit scoped Standard, der mehr als 130.000 Zeichen definiert und jeder weist einen numerischen Code (ein "Codepunkt"). Es definiert auch Regeln dafür, wie Sie diesen Text sortieren, normalisieren es, seinen Fall ändern, und vieles mehr. Ein Zeichen in Unicode wird durch einen Codepunkt von Null bis zu 0x10FFFF inklusive vertreten, obwohl einige Codepunkte sind reserviert und können nicht für Zeichen verwendet werden.

Die Codes in Unicode können in mehr als einer Codierung dargestellt werden. Die einfachste ist UTF-32, die einfach den Code Punkt als 32-Bit-Integer kodiert, mit denen jedes 4 Bytes breit.

UTF-8 ist eine weitere Codierung und schnell die de-facto-Standard geworden. Es kodiert als eine Folge von Byte-Werten. Jeder Codepunkt kann eine variable Anzahl dieser Bytes verwenden. Codepunkte im ASCII-Bereich codiert sind kahl, mit ASCII-kompatibel zu sein. Code Punkte außerhalb dieses Bereichs eine variable Anzahl von Bytes verwenden, entweder 2, 3 oder 4, je nachdem, welcher Reichweite sie sind in.

UTF-8 wurde mit diesen Eigenschaften im Vordergrund:

  • ASCII-Zeichen codiert sind genau so, wie sie in ASCII sind, so dass ein ASCII-String als UTF-8 auch gültig ist.

  • Binary Sortierung:. Sortierung UTF-8-Strings eine naive binäre Sortierung verwendet, wird in allen Codepunkten noch in numerischer Reihenfolge sortiert werden

  • Charaktere außerhalb des ASCII-Bereichs verwenden keine Bytes im ASCII-Bereich, sicherzustellen, dass sie für ASCII-Zeichen nicht verwechselt werden können. Dies ist auch ein Sicherheitsmerkmal.

  • UTF-8 kann leicht überprüft werden, und unterscheidet sich von anderen Zeichencodierungen von einem Validator. Text in anderer 8-Bit-oder Multi-Byte-Codierung wird nur sehr selten validieren auch als UTF-8.

  • Random Access: An jedem Punkt in dem UTF-8-String ist es möglich zu sagen, ob das Byte an dieser Position das erste Byte eines Zeichens ist oder nicht, und zu Beginn dieses Zeichens zurückzuzuverfolgen, ohne um zu Beginn der Zeichenfolge zu etwas beziehen.

  

Sie sind die gleiche Sache, nicht wahr?

Nein, sie sind es nicht.


Ich denke, der erste Satz des Wikipedia eine schöne referenzierten gibt, kurze Zusammenfassung:

  

UTF-8 ist ein variabler Breite Zeichen codiert, das Codieren alle 1.112.064 gültigen Codepunkte in Unicode 3.59 8-Bit-Bytes verwendet wird.

Um dies näher auszuführen:

  • Unicode ist ein Standard, der eine Karte von Zeichen Zahlen definiert, die so genannten Code Punkte , (wie in dem Beispiel unten). Für die vollständige Abbildung, können Sie einen Blick hier .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 ist eine der Möglichkeiten, um diese Codepunkte in ein Formular ein Computer verstehen kann zu kodieren, auch bekannt als Bits . Mit anderen Worten, es ist ein Weg / Algorithmus jedes dieser Codepunkte zu einer Folge von Bits oder Konvertieren eine Folge von Bits zu den entsprechenden Codepunkten zu konvertieren. Beachten Sie, dass es viele alternative Codierungen für Unicode.


Joel gibt eine wirklich schöne Erklärung und einen Überblick über die Geschichte hier .

UTF-8 ist ein Verfahren zum Codieren von Unicode-Zeichen unter Verwendung von 8-Bit-Sequenzen.

Unicode ist ein Standard eine Vielzahl von Zeichen aus vielen Sprachen für die Darstellung.

Wenn ich kann zusammenfassen, was ich aus diesem Thread gesammelt:

Unicode 'übersetzt' Zeichen Ordnungszahl (dezimal) .

à = 224

UTF-8 ist eine Codierung, dass 'übersetzt' diese Zahlen binär Darstellungen .

224 = 11000011 10100000
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top