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?
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?
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.
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 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:
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.
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.
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 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.