Wenn UTF-8 eine 8-Bit-Codierung ist, warum benötigt es 1-4 Bytes?

7

Auf der Unicode-Site steht geschrieben, dass UTF-8 durch 1-4 Bytes repräsentiert werden kann. Wie ich aus dieser Frage verstehe Ссылка ist UTF-8 eine 8- Bits kodieren. Also, was ist die Wahrheit? Wenn es 8-Bit-Codierung ist, was ist dann der Unterschied zwischen ASCII und UTF-8? Wenn nicht, warum heißt es UTF-8 und warum brauchen wir UTF-16 und andere, wenn sie den gleichen Speicher belegen?

    
Sergey 14.06.2011, 04:07
quelle

3 Antworten

15

Das absolute Minimum, das jeder Softwareentwickler unbedingt, unbedingt über Unicode und Zeichensätze (keine Ausreden!) wissen muss Joel Spolsky - Mittwoch, 8. Oktober 2003

Auszug von oben:

  

So wurde das geniale Konzept von UTF-8 erfunden. UTF-8 war ein weiteres System zum Speichern Ihrer Zeichenfolge von Unicode-Codepunkten, diese magischen U + -Zahlen, im Speicher unter Verwendung von 8-Bit-Bytes. In UTF-8 wird jeder Codepunkt von 0-127 in einem einzigen Byte gespeichert. Nur Codepunkte 128 und höher werden unter Verwendung von 2, 3, tatsächlich bis zu 6 Bytes gespeichert.   Dies hat den netten Nebeneffekt, dass englischer Text in UTF-8 genau so aussieht wie in ASCII, sodass die Amerikaner nichts falsch finden. Nur der Rest der Welt muss durch Reifen springen. Genauer gesagt, Hallo, das war U + 0048 U + 0065 U + 006C U + 006C U + 006F, wird als 48 65 6C 6C 6F gespeichert, die, siehe! ist das gleiche wie es in ASCII und ANSI und jedem OEM-Zeichensatz auf dem Planeten gespeichert wurde. Nun, wenn Sie so mutig sind, Akzentbuchstaben oder griechische Buchstaben oder klingonische Buchstaben zu verwenden, müssen Sie mehrere Bytes verwenden, um einen einzelnen Codepunkt zu speichern, aber die Amerikaner werden es nie bemerken. (UTF-8 hat auch die nette Eigenschaft, dass unwissender alter String-Verarbeitungscode, der ein einzelnes 0 Byte als Null-Terminator verwenden möchte, keine Strings abschneidet).

     

Bisher habe ich Ihnen drei Möglichkeiten zur Unicode-Codierung gegeben. Die herkömmlichen Store-in-2-Byte-Methoden heißen UCS-2 (weil sie zwei Bytes haben) oder UTF-16 (weil sie 16 Bits haben), und Sie müssen immer noch herausfinden, ob es High-Endian-UCS- ist. 2 oder Low-End-UCS-2. Und es gibt den populären neuen UTF-8-Standard, der die nette Eigenschaft hat, auch respektabel zu arbeiten, wenn Sie das glückliche Zusammentreffen von englischem Text und braindead Programmen haben, die völlig nicht wissen, dass es irgendetwas anderes als ASCII gibt.

     

Es gibt tatsächlich eine Reihe anderer Möglichkeiten, Unicode zu codieren. Es gibt etwas namens UTF-7, das sehr ähnlich zu UTF-8 ist, aber garantiert, dass das High-Bit immer Null ist, so dass Unicode durch eine Art drakonisches Polizei-Staat-E-Mail-System passieren muss, das 7 Bits für recht hält genug, danke, es kann immer noch unbeschadet durchkommen. Es gibt UCS-4, das jeden Codepunkt in 4 Bytes speichert, was die nette Eigenschaft hat, dass jeder einzelne Codepunkt in der gleichen Anzahl von Bytes gespeichert werden kann, aber, Gott sei Dank, wären die Texaner nicht so fett, um sie zu verschwenden so viel Speicher.

     

Und jetzt, da Sie sich Dinge in Form von platonischen idealen Buchstaben vorstellen, die durch Unicode-Codepunkte repräsentiert werden, können diese Unicode-Codepunkte auch in jedem Old-School-Codierungsschema codiert werden! Sie könnten beispielsweise die Unicode-Zeichenfolge für Hello (U + 0048 U + 0065 U + 006C U + 006C U + 006F) in ASCII oder die alte OEM-Griechisch-Codierung oder die hebräische ANSI-Codierung oder eine beliebige aus mehreren hundert Codierungen codieren die bisher erfunden wurden, mit einem Haken: einige Buchstaben könnten nicht auftauchen! Wenn es keine Entsprechung für den Unicode-Codepunkt gibt, den Sie in der Codierung darstellen möchten, in der Sie ihn darzustellen versuchen, erhalten Sie normalerweise ein kleines Fragezeichen:? oder, wenn du wirklich gut bist, eine Kiste. Was hast du bekommen? - & gt;

     

Es gibt Hunderte von traditionellen Codierungen, die nur einige Codepunkte korrekt speichern und alle anderen Codepunkte in Fragezeichen ändern können. Einige beliebte Kodierungen von englischem Text sind Windows-1252 (der Windows 9x Standard für westeuropäische Sprachen) und ISO-8859-1, auch bekannt als Latin-1 (auch nützlich für jede westeuropäische Sprache). Versuchen Sie jedoch, russische oder hebräische Buchstaben in diesen Kodierungen zu speichern, und Sie erhalten eine Reihe von Fragezeichen. UTF 7, 8, 16 und 32 haben alle die schöne Eigenschaft, jeden Codepunkt korrekt speichern zu können.

    
Sparky 14.06.2011, 04:09
quelle
12

Die "8-Bit" -Kodierung bedeutet, dass die einzelnen Bytes der Kodierung 8 Bits verwenden. Im Gegensatz dazu ist reines ASCII eine 7-Bit-Codierung, da es nur Codepunkte 0-127 hat. Früher hatte die Software Probleme mit 8-Bit-Kodierungen. Einer der Gründe für Base-64- und Uuencode-Kodierungen war, Binärdaten über E-Mail-Systeme zu erhalten, die keine 8-Bit-Kodierungen verarbeiten. Es ist jedoch ein Jahrzehnt oder länger her, dass dies als Problem nicht mehr zulässig war - Software musste 8-Bit-sauber sein oder mit 8-Bit-Codierungen umgehen können.

Unicode selbst ist ein 21-Bit-Zeichensatz. Es gibt eine Reihe von Kodierungen dafür:

  • UTF-32, wobei jeder Unicode-Codepunkt in einer 32-Bit-Ganzzahl
  • gespeichert wird
  • UTF-16, wo viele Unicode-Codepunkte in einer einzelnen 16-Bit-Ganzzahl gespeichert sind, aber einige benötigen zwei 16-Bit-Ganzzahlen (so dass sie 2 oder 4 Byte pro Unicode-Codepunkt benötigen).
  • UTF-8, wobei Unicode-Codepunkte 1, 2, 3 oder 4 Bytes zum Speichern eines einzelnen Unicode-Codepunkts benötigen.

Also, "UTF-8 kann durch 1-4 Bytes dargestellt werden" ist wahrscheinlich nicht die geeignetste Art, es zu formulieren. "Unicode-Codepunkte können in UTF-8 durch 1-4 Bytes dargestellt werden" wäre geeigneter.

    
Jonathan Leffler 14.06.2011 04:18
quelle
10

UTF-8 ist eine Codierung mit 8 Bit variabler Breite . Die ersten 128 Zeichen im Unicode haben bei Darstellung mit UTF-8-Codierung die Darstellung als ASCII-Zeichen.

Um dies weiter zu verstehen, behandelt Unicode Zeichen als Codepunkte - eine bloße Zahl, die auf verschiedene Arten dargestellt werden kann (die Codierungen). UTF-8 ist eine solche Codierung. Es wird am häufigsten verwendet, da es unter allen Kodierungen die besten Platzverbrauchseigenschaften bietet. Wenn Sie Zeichen aus dem ASCII-Zeichensatz in der UTF-8-Codierung speichern, benötigen die UTF-8-codierten Daten den gleichen Speicherplatz. Dies ermöglichte es Anwendungen, die zuvor ASCII verwendet haben, sich nahtlos in Unicode zu bewegen (naja, nicht ganz, aber es hat sicher nicht zu etwas wie Y2K geführt), da die Zeichendarstellungen die gleichen sind.

Ich werde diesen Auszug hier aus RFC 3629 hinterlassen, wie die UTF-8-Codierung funktioniert:

%Vor%

Sie werden bemerken, warum die Kodierung dazu führt, dass Zeichen zwischen 1 und 4 Bytes (die rechte Spalte) für verschiedene Zeichenbereiche in Unicode (die linke Spalte) belegen.

UTF-16, UTF-32, UCS-2 usw. verwenden verschiedene Codierungsschemata, bei denen die Codepunkte als 16-Bit- oder 32-Bit-Codes anstelle von 8-Bit-Codes dargestellt werden, die UTF-8 verwendet.

    
Vineet Reynolds 14.06.2011 05:04
quelle

Tags und Links