553 Stimmen

Was ist der Unterschied zwischen ASCII und Unicode?

Was ist der genaue Unterschied zwischen Unicode und ASCII?

ASCII hat insgesamt 128 Zeichen (256 im erweiterten Satz).

Gibt es eine Größenspezifikation für Unicode-Zeichen?

670voto

Kerrek SB Punkte 445528

ASCII definiert 128 Zeichen, die den Zahlen 0–127 zugeordnet sind. Unicode definiert (weniger als) 221 Zeichen, die ebenfalls Zahlen von 0–221 zugeordnet sind (obwohl noch nicht alle Zahlen aktuell zugewiesen sind und einige reserviert sind).

Unicode ist eine Erweiterung von ASCII, und die Zahlen 0–127 haben die gleiche Bedeutung in ASCII wie in Unicode. Zum Beispiel bedeutet die Zahl 65 "Lateinischer Großbuchstabe 'A'".

Weil Unicode-Zeichen im Allgemeinen nicht in ein 8-Bit-Byte passen, gibt es zahlreiche Möglichkeiten, Unicode-Zeichen in Bytefolgen zu speichern, wie z.B. UTF-32 und UTF-8.

573voto

Andrew Punkte 7270

Das Verständnis, weshalb ASCII und Unicode überhaupt erst erschaffen wurden, half mir dabei, die Unterschiede zwischen den beiden zu verstehen.

ASCII, Ursprünge

Wie bereits in den anderen Antworten erwähnt wurde, verwendet ASCII 7 Bits zur Darstellung eines Zeichens. Mit 7 Bits können wir maximal 2^7 (= 128) unterschiedliche Kombinationen haben*. Das bedeutet, dass wir maximal 128 Zeichen darstellen können.

Warte mal, 7 Bits? Aber warum nicht 1 Byte (8 Bits)?

Das letzte Bit (8.) wird für die Fehlervermeidung als Paritätsbit verwendet. Das war früher relevant.

Die meisten ASCII-Zeichen sind druckbare Zeichen des Alphabets wie abc, ABC, 123, ?&!, usw. Die anderen sind Steuerzeichen wie Wagenrücklauf, Zeilenvorschub, Tabulator, usw.

Unten finden Sie die binäre Darstellung einiger Zeichen in ASCII:

0100101 -> % (Prozentzeichen - 37)
1000001 -> A (Großbuchstabe A - 65)
1000010 -> B (Großbuchstabe B - 66)
1000011 -> C (Großbuchstabe C - 67)
0001101 -> Wagenrücklauf (13)

Sehen Sie sich die vollständige ASCII-Tabelle hier an.

ASCII war ausschließlich für Englisch gedacht.

Was? Warum nur Englisch? Es gibt so viele Sprachen da draußen!

Weil das Zentrum der Computerindustrie zu dieser Zeit in den USA war. Deshalb brauchten sie keine Akzente oder andere Markierungen wie á, ü, ç, ñ, usw. zu unterstützen (auch bekannt als Diakritika).

Erweitertes ASCII

Einige kluge Leute begannen, das 8. Bit (das Bit für die Parität) zu verwenden, um mehr Zeichen zur Unterstützung ihrer Sprache zu codieren (um zum Beispiel "é" im Französischen zu unterstützen). Durch die Nutzung eines zusätzlichen Bits wurde die Größe der ursprünglichen ASCII-Tabelle verdoppelt, um bis zu 256 Zeichen zu mappen (2^8 = 256 Zeichen). Nicht mehr wie zuvor (128).

10000010 -> é (e mit Akut - 130)
10100000 -> á (a mit Akut - 160)

Der Name für dieses "ASCII erweitert auf 8 Bits und nicht mehr 7 Bits wie zuvor" könnte einfach als "erweitertes ASCII" oder "8-Bit-ASCII" bezeichnet werden.

Wie @Tom in seinem unten stehenden Kommentar erklärt hat, gibt es nicht etwas wie "erweitertes ASCII", dennoch ist dies eine einfache Möglichkeit, diesen 8-Bit-Trick zu bezeichnen. Es gibt viele Variationen der 8-Bit-ASCII-Tabelle, zum Beispiel die ISO 8859-1, auch bekannt als ISO-Latin-1.

Unicode, Der Aufstieg

Erweitertes ASCII löst das Problem für Sprachen, die auf dem lateinischen Alphabet basieren... was ist mit den anderen, die ein vollkommen anderes Alphabet benötigen? Griechisch? Russisch? Chinesisch und dergleichen?

Wir hätten eine komplett neue Zeichensatz benötigt... das ist die Begründung hinter Unicode. Unicode enthält nicht jedes Zeichen aus jeder Sprache, aber es enthält sicherlich eine riesige Menge an Zeichen (siehe diese Tabelle).

Sie können den Text nicht auf Ihrer Festplatte als "Unicode" speichern. Unicode ist eine abstrakte Repräsentation des Textes. Sie müssen diese abstrakte Repräsentation "kodieren". Hier kommt eine Kodierung ins Spiel.

Kodierungen: UTF-8 vs UTF-16 vs UTF-32

Diese Antwort erklärt die Grundlagen ziemlich gut:

  • UTF-8 und UTF-16 sind variable Längenkodierungen.
  • In UTF-8 kann ein Zeichen mindestens 8 Bits belegen.
  • In UTF-16 beginnt die Länge eines Zeichens mit 16 Bits.
  • UTF-32 ist eine feste Längenkodierung von 32 Bits.

UTF-8 verwendet den ASCII-Satz für die ersten 128 Zeichen. Das ist praktisch, denn das bedeutet, dass ASCII-Text auch in UTF-8 gültig ist.

Eselsbrücken:

  • UTF-8: mindestens 8 Bits.
  • UTF-16: mindestens 16 Bits.
  • UTF-32: mindestens und maximal 32 Bits.

Hinweis:

Warum 2^7?

Das ist für einige offensichtlich, aber für den Fall. Wir haben sieben verfügbare Plätze, die entweder mit 0 oder 1 gefüllt sind (Binärcode). Jeder kann zwei Kombinationen haben. Wenn wir sieben Plätze haben, haben wir 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128 Kombinationen. Stellen Sie sich dies als ein Kombinationsschloss mit sieben Rädern vor, wobei jedes Rad nur zwei Zahlen haben kann.

Quelle: Wikipedia, diesen großartigen Blog-Beitrag und Mocki.co, wo ich diese Zusammenfassung ursprünglich gepostet habe.

96voto

Hans Passant Punkte 894572

ASCII hat 128 Codepunkte, 0 bis 127. Es passt in ein einziges 8-Bit-Byte, die Werte 128 bis 255 wurden tendenziell für andere Zeichen verwendet. Mit inkompatiblen Entscheidungen, die das Code-Seiten-Desaster verursacht haben. Text, der in einer Code-Seite codiert ist, kann von einem Programm, das von einer anderen Code-Seite ausgeht oder errät, nicht richtig gelesen werden.

Unicode entstand, um dieses Desaster zu lösen. Version 1 begann mit 65536 Codepunkten, die üblicherweise in 16-Bit codiert sind. Später in Version 2 auf 1,1 Millionen Codepunkte erweitert. Die aktuelle Version ist 6.3 und verwendet 110.187 der verfügbaren 1,1 Millionen Codepunkte. Das passt nicht mehr in 16 Bits.

Die Kodierung in 16-Bit war üblich, als Version 2 herauskam, zum Beispiel von Microsoft- und Apple-Betriebssystemen verwendet. Und Sprachlaufzeiten wie Java. Die v2-Spezifikation fand einen Weg, diese 1,1 Millionen Codepunkte in 16-Bit zu mappen. Eine Kodierung namens UTF-16, eine variable Längenkodierung, bei der ein Codepunkt entweder 2 oder 4 Bytes benötigen kann. Die ursprünglichen v1-Codepunkte benötigen 2 Bytes, die hinzugefügten benötigen 4.

Eine weitere häufig verwendete variable Längenkodierung, die in *nix-Betriebssystemen und Werkzeugen verwendet wird, ist UTF-8, ein Codepunkt kann zwischen 1 und 4 Bytes benötigen, die ursprünglichen ASCII-Codes benötigen 1 Byte, die anderen mehr. Die einzige nicht-variable Längenkodierung ist UTF-32, benötigt 4 Bytes für einen Codepunkt. Wird nicht oft verwendet, da sie recht verschwenderisch ist. Es gibt noch andere, wie UTF-1 und UTF-7, die weitgehend ignoriert werden.

Ein Problem bei den UTF-16/32-Kodierungen ist, dass die Reihenfolge der Bytes von der Endianität der Maschine abhängt, die den Textstrom erstellt hat. Also kommen UTF-16BE, UTF-16LE, UTF-32BE und UTF-32LE hinzu.

Durch die unterschiedlichen Kodierungsvarianten kommt das Code-Seiten-Desaster in gewissem Maße zurück, zusammen mit hitzigen Debatten unter Programmierern, welche UTF-Variante "die beste" ist. Ihre Verbindung mit den Voreinstellungen des Betriebssystems zieht im Wesentlichen die Grenzen. Eine Gegenmaßnahme ist die Definition eines BOM (Byte Order Mark), ein spezieller Codepunkt (U+FEFF, Null-Breite Leerstelle) am Anfang eines Textstroms, der anzeigt, wie der Rest des Stroms codiert ist. Er gibt sowohl die UTF-Kodierung als auch die Endianität an und ist neutral gegenüber einem Textrendering-Motor. Leider ist er optional und viele Programmierer beharren darauf, ihn auszulassen, daher sind Unfälle immer noch recht häufig.

37voto

Siddarth Kanted Punkte 5430

Java bietet Unterstützung für Unicode, d.h. es unterstützt alle weltweiten Alphabete. Daher beträgt die Größe von Char in Java 2 Byte. Und der Bereich ist 0 bis 65535.

Bildbeschreibung hier eingeben

18voto

Jukka K. Korpela Punkte 186389

ASCII hat 128 Codepositionen, die für grafische Zeichen und Steuerzeichen (Steuercodes) verwendet werden.

Unicode hat 1.114.112 Codepositionen. Etwa 100.000 von ihnen wurden bisher für Zeichen zugewiesen, und viele Codepunkte wurden dauerhaft zu Nichtzeichen gemacht (d. h. sie werden nie zur Kodierung eines Zeichens verwendet), und die meisten Codepunkte sind noch nicht zugewiesen.

Die einzigen Dinge, die ASCII und Unicode gemeinsam haben, sind: 1) Es handelt sich um Zeichencodes. 2) Die ersten 128 Codepositionen von Unicode wurden so definiert, dass sie dieselbe Bedeutung wie in ASCII haben, mit der Ausnahme, dass die Positionen der ASCII-Steuercodes einfach als Steuercodes bezeichnet sind, mit Namen, die ihren ASCII-Namen entsprechen, aber ihre Bedeutung in Unicode nicht definiert ist.

Manchmal wird Unicode jedoch (sogar im Unicode-Standard!) als "erweitertes ASCII" bezeichnet. Dies ist ein Slogan, der hauptsächlich die Idee vermitteln soll, dass Unicode als universeller Zeichencode gedacht ist, wie es einst bei ASCII der Fall war (obwohl der Zeichenvorrat von ASCII hoffnungslos unzureichend für den universellen Gebrauch war), im Gegensatz zur Verwendung unterschiedlicher Codes in verschiedenen Systemen und Anwendungen und für verschiedene Sprachen.

Unicode definiert nur die "logische Größe" der Zeichen: Jedes Zeichen hat eine Code-Nummer in einem bestimmten Bereich. Diese Code-Nummern können mit verschiedenen Übertragungscodierungen dargestellt werden, und intern, im Speicher, werden Unicode-Zeichen in der Regel mit einer oder zwei 16-Bit-Quantitäten pro Zeichen dargestellt, je nach Zeichenbereich, manchmal mit einer 32-Bit-Quantität pro Zeichen.

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