Was ist der Unterschied zwischen ASCII und Unicode?


Antworten:


534

ASCII definiert 128 Zeichen, die den Zahlen 0–127 zugeordnet sind. Unicode definiert (weniger als) 2 21 Zeichen, die ebenfalls den Nummern 0–2 21 zugeordnet sind (obwohl derzeit nicht alle Nummern zugewiesen sind und einige reserviert sind).

Unicode ist eine Obermenge von ASCII, und die Zahlen 0–127 haben in ASCII dieselbe Bedeutung wie in Unicode. Zum Beispiel bedeutet die Zahl 65 "lateinische Hauptstadt 'A'".

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


4
@riderBill: Was jetzt? Über welche 3 Bits sprichst du? Es gibt keine Bits in Unicode. Nur Codepunkte.
Kerrek SB

@riderBill: nochmal: von welchen "3 bytes" sprichst du gerade? :-) (Nichts davon hat mit Unicode zu tun. Bei Unicode geht es nur darum, Zahlen eine Bedeutung
zuzuweisen

8
@riderBill: Unicode verwendet nicht "zwischen 1 und 4 Bytes". Unicode ist eine Bedeutungszuweisung für Zahlen. Es werden keine Bytes verwendet. Es gibt bestimmte standardisierte Codierungsschemata, um Unicode-Codepunkte als Bytestrom darzustellen, sie sind jedoch orthogonal zu Unicode als Zeichensatz. (Ja,
zögern

@CleanCrispCode Unicode ist eigentlich eine Obermenge von ISO-8859-1 , die selbst eine Obermenge von ASCII ist. Manchmal ist es nützlich zu wissen.
Mark Ransom

8
Zur Verdeutlichung ist der Unicode- Zeichensatz selbst eine Obermenge des ISO-8859-1- Zeichensatzes , aber die UTF-8- Codierung ist keine Obermenge der ISO-8859-1- Codierung, sondern die ASCII- Codierung .
Minmaxavg

393

Das Verständnis, warum ASCII und Unicode überhaupt erstellt wurden, half mir, die Unterschiede zwischen den beiden zu verstehen.

ASCII, Ursprünge

Wie in den anderen Antworten angegeben, verwendet ASCII 7 Bits, um ein Zeichen darzustellen. Durch die Verwendung von 7 Bits können maximal 2 ^ 7 (= 128) verschiedene Kombinationen * verwendet werden . Dies bedeutet, dass wir maximal 128 Zeichen darstellen können.

Warten Sie, 7 Bits? Aber warum nicht 1 Byte (8 Bit)?

Das letzte Bit (8.) wird verwendet, um Fehler als Paritätsbit zu vermeiden . Dies war vor Jahren 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.

Siehe unten die binäre Darstellung einiger Zeichen in ASCII:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

Die vollständige ASCII-Tabelle finden Sie hier .

ASCII war nur für Englisch gedacht.

Was? Warum nur Englisch? So viele Sprachen da draußen!

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

ASCII erweitert

Einige clevere Leute haben angefangen, das 8. Bit (das für die Parität verwendete Bit) zu verwenden, um mehr Zeichen zu codieren, um ihre Sprache zu unterstützen (um beispielsweise "é" auf Französisch zu unterstützen). Durch die Verwendung eines zusätzlichen Bits wurde die Größe der ursprünglichen ASCII-Tabelle verdoppelt, um bis zu 256 Zeichen zuzuordnen (2 ^ 8 = 256 Zeichen). Und nicht 2 ^ 7 wie zuvor (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

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

Wie @Tom in seinem Kommentar unten hervorhob , gibt es kein " erweitertes ASCII ", aber dies ist eine einfache Möglichkeit, auf diesen 8-Bit-Trick zu verweisen. Es gibt viele Variationen der 8-Bit-ASCII-Tabelle, z. B. ISO 8859-1, auch ISO Latin-1 genannt .

Unicode, der Aufstieg

ASCII Extended löst das Problem für Sprachen, die auf dem lateinischen Alphabet basieren. Was ist mit den anderen, die ein völlig anderes Alphabet benötigen? Griechisch? Russisch? Chinesen und dergleichen?

Wir hätten einen völlig neuen Zeichensatz gebraucht ... das ist das Rationale hinter Unicode. Unicode enthält nicht jedes Zeichen aus jeder Sprache, aber es enthält sicher eine gigantische Anzahl von Zeichen ( siehe diese Tabelle ).

Sie können keinen Text als "Unicode" auf Ihrer Festplatte speichern. Unicode ist eine abstrakte Darstellung des Textes. Sie müssen diese abstrakte Darstellung "codieren". Hier kommt eine Kodierung ins Spiel.

Codierungen: UTF-8 gegen UTF-16 gegen UTF-32

Diese Antwort macht einen ziemlich guten Job bei der Erklärung der Grundlagen:

  • UTF-8 und UTF-16 sind Codierungen mit variabler Länge.
  • In UTF-8 kann ein Zeichen mindestens 8 Bits belegen.
  • In UTF-16 beginnt eine Zeichenlänge mit 16 Bit.
  • UTF-32 ist eine Codierung mit fester Länge von 32 Bit.

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

Mnemonik:

  • UTF- 8 : mindestens 8 Bits.
  • UTF- 16 : mindestens 16 Bit.
  • UTF- 32 : minimale und maximale 32 Bit.

Hinweis:

Warum 2 ^ 7?

Dies ist für einige offensichtlich, aber nur für den Fall. Wir haben sieben Slots zur Verfügung, die entweder mit 0 oder 1 ( Binärcode ) gefüllt sind . Jeder kann zwei Kombinationen haben. Wenn wir sieben Punkte haben, haben wir 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 Kombinationen. Stellen Sie sich dies als Zahlenschloss mit sieben Rädern vor, wobei jedes Rad nur zwei Nummern hat.

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


7
Es gibt keinen Text, sondern verschlüsselten Text. Einige Codierungen sind sehr einfach, insbesondere für Zeichensätze mit <= 256 Codepunkten. "Extended ASCII" ist ein sehr mehrdeutiger Begriff. Es gibt einige, die Griechisch, Russisch und / oder Polnisch unterstützen. ASCII ist nicht ausreichend für englischen Text, der á, ü, ç, ñ verwendet. Ich vermute, dass es eher zur Unterstützung von Computersprachen als von menschlichen Sprachen entwickelt wurde. Wenn Sie eine Datei oder einen Stream schreiben, haben Sie dogmatisch einen Zeichensatz und wählen eine Codierung. Ihr Leser muss die Bytes und das Wissen über die Codierung erhalten. Andernfalls ist die Kommunikation fehlgeschlagen.
Tom Blodget

Vielen Dank für den Nachtrag. Ich habe die Antwort entsprechend aktualisiert.
Andrew

Vielen Dank. Ich bemerke überall, dass ASCII-Tabellen Zeichencodes als 0-127 anzeigen, aber UTF-8-Tabellen zeigen die Codes als Hex und nicht als Ganzzahlen. Gibt es einen Grund dafür? Warum zeigen UTF-X-Tabellen nicht 0-127 / 255/65535 gegenüber 00-AF? Bedeutet das etwas?
Wayofthefuture

Vielen Dank für Ihre Antwort. Kurze Frage: 'In UTF-16 beginnt eine Zeichenlänge mit 16 Bit' - Bedeutet dies, dass alphanumerische Zeichen nicht durch UTF-16 dargestellt werden können, da es sich nur um 8-Bit-Zeichen handelt?
Moondra

Tolle Antwort, nur ich habe ein Problem - verwendet Polnisch wirklich ein anderes Alphabet? Ich dachte, wir verwenden dasselbe wie Englisch, nur mit einigen zusätzlichen Buchstaben?
Nicofisi

89

ASCII hat 128 Codepunkte, 0 bis 127. Es kann in ein einzelnes 8-Bit-Byte passen, wobei die Werte 128 bis 255 tendenziell für andere Zeichen verwendet werden. Mit inkompatiblen Auswahlmöglichkeiten, die die Codepage- Katastrophe verursachen. In einer Codepage codierter Text kann von einem Programm, das eine andere Codepage annimmt oder errät, nicht korrekt gelesen werden.

Unicode kam, um diese Katastrophe 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 Bit.

Die Codierung in 16-Bit war üblich, als v2 auf den Markt kam, beispielsweise von Microsoft- und Apple-Betriebssystemen. Und Sprachlaufzeiten wie Java. Die v2-Spezifikation hat eine Möglichkeit gefunden, diese 1,1 Millionen Codepunkte in 16-Bit abzubilden. Eine Codierung namens UTF-16, eine Codierung variabler Länge, bei der ein Codepunkt entweder 2 oder 4 Byte aufnehmen kann. Die ursprünglichen v1-Codepunkte benötigen 2 Bytes, hinzugefügte 4.

Eine andere Codierung mit variabler Länge, die in * nix-Betriebssystemen und -Tools sehr häufig verwendet wird, ist UTF-8. Ein Codepunkt kann zwischen 1 und 4 Byte dauern, die ursprünglichen ASCII-Codes benötigen 1 Byte, der Rest mehr. Die einzige nicht variable Längencodierung ist UTF-32, die 4 Bytes für einen Codepunkt benötigt. Nicht oft verwendet, da es ziemlich verschwenderisch ist. Es gibt andere, wie UTF-1 und UTF-7, die weitgehend ignoriert werden.

Ein Problem bei den UTF-16/32-Codierungen besteht darin, dass die Reihenfolge der Bytes von der Endianität des Computers abhängt, der den Textstrom erstellt hat. Fügen Sie also dem Mix UTF-16BE, UTF-16LE, UTF-32BE und UTF-32LE hinzu.

Diese unterschiedlichen Codierungsoptionen bringen die Codepage-Katastrophe bis zu einem gewissen Grad zurück, zusammen mit heftigen Debatten unter Programmierern, welche UTF-Auswahl "am besten" ist. Ihre Zuordnung zu den Standardeinstellungen des Betriebssystems zieht die Grenzen. Eine Gegenmaßnahme ist die Definition einer Stückliste, der Byte Order Mark, eines speziellen Codepunkts (U + FEFF, Raum mit der Breite Null) am Anfang eines Textstroms, der angibt, wie der Rest des Stroms codiert wird. Es zeigt sowohl die UTF-Codierung als auch die Endianess an und ist für eine Text-Rendering-Engine neutral. Leider ist es optional und viele Programmierer beanspruchen ihr Recht, es wegzulassen, so dass Unfälle immer noch ziemlich häufig sind.


31

Java bietet Unterstützung für Unicode, dh es unterstützt alle weltweiten Alphabete. Daher beträgt die Größe von char in Java 2 Bytes. Der Bereich liegt zwischen 0 und 65535.

Geben Sie hier die Bildbeschreibung ein


Keypicture zu erklären .. Nizza
Ponmari Subramanian

2
Schade, dass es falsch ist. "ASCII-Codes (128)" wäre korrekt.
Mark Tolonen

15

ASCII verfügt über 128 Codepositionen, die Grafikzeichen und Steuerzeichen (Steuercodes) zugeordnet sind.

Unicode hat 1.114.112 Codepositionen. Etwa 100.000 von ihnen wurden derzeit Zeichen zugewiesen, und viele Codepunkte wurden dauerhaft zu Nicht-Zeichen gemacht (dh werden nie zum Codieren von Zeichen verwendet), und die meisten Codepunkte sind noch nicht zugewiesen.

Die einzigen Gemeinsamkeiten von ASCII und Unicode sind: 1) Es handelt sich um Zeichencodes. 2) Die 128 ersten Codepositionen von Unicode haben dieselbe Bedeutung wie in ASCII, außer dass die Codepositionen von ASCII-Steuerzeichen nur als Steuerzeichen bezeichnet werden, wobei die Namen ihren ASCII-Namen entsprechen, ihre Bedeutung jedoch nicht in Unicode definiert.

Manchmal wird Unicode jedoch (sogar im Unicode-Standard!) Als "Wide ASCII" charakterisiert. Dies ist ein Slogan, der hauptsächlich versucht, die Idee zu vermitteln, dass Unicode ein universeller Zeichencode sein soll, wie es früher bei ASCII der Fall war (obwohl das Zeichenrepertoire von ASCII für den universellen Gebrauch hoffnungslos unzureichend war), im Gegensatz zur Verwendung verschiedener Codes in verschiedene Systeme und Anwendungen und für verschiedene Sprachen.

Unicode als solcher definiert nur die „logische Größe“ von Zeichen: Jedes Zeichen hat eine Codenummer in einem bestimmten Bereich. Diese Codenummern können mit unterschiedlichen Übertragungscodierungen dargestellt werden, und intern im Speicher werden Unicode-Zeichen normalerweise mit einer oder zwei 16-Bit-Mengen pro Zeichen dargestellt, je nach Zeichenbereich, manchmal mit einer 32-Bit-Menge pro Zeichen.


2
Ich denke, die häufigste Codierung für Unicode ist heutzutage UTF-8. UTF-8 codiert die meisten Codepunkte in 1, 2 oder 3 Bytes.
Binarus

14

ASCII und Unicode sind Zwei-Zeichen-Codierungen. Grundsätzlich sind sie Standards für die Darstellung von Differenzzeichen in Binärform, damit sie in digitalen Medien geschrieben, gespeichert, übertragen und gelesen werden können. Der Hauptunterschied zwischen den beiden besteht in der Art und Weise, wie sie das Zeichen codieren, und in der Anzahl der Bits, die sie jeweils verwenden. ASCII verwendete ursprünglich sieben Bits, um jedes Zeichen zu codieren. Dies wurde später mit Extended ASCII auf acht erhöht, um die offensichtliche Unzulänglichkeit des Originals zu beheben. Im Gegensatz dazu verwendet Unicode ein Programm zur variablen Bitcodierung, bei dem Sie zwischen 32-, 16- und 8-Bit-Codierungen wählen können. Wenn Sie mehr Bits verwenden, können Sie mehr Zeichen auf Kosten größerer Dateien verwenden, während Sie mit weniger Bits nur eine begrenzte Auswahl haben, aber viel Platz sparen. Mit weniger Bits (dh

Einer der Hauptgründe, warum Unicode das Problem war, ergab sich aus den vielen nicht standardmäßigen erweiterten ASCII-Programmen. Wenn Sie nicht die vorherrschende Seite verwenden, die von Microsoft und den meisten anderen Softwareunternehmen verwendet wird, treten wahrscheinlich Probleme mit Ihren Zeichen auf, die als Kästchen angezeigt werden. Unicode beseitigt dieses Problem praktisch, da alle Zeichencodepunkte standardisiert wurden.

Ein weiterer großer Vorteil von Unicode ist, dass es maximal eine große Anzahl von Zeichen aufnehmen kann. Aus diesem Grund enthält Unicode derzeit die meisten geschriebenen Sprachen und bietet noch Platz für noch mehr. Dies umfasst typische Skripte von links nach rechts wie Englisch und sogar Skripte von rechts nach links wie Arabisch. Chinesisch, Japanisch und die vielen anderen Varianten sind auch in Unicode vertreten. Daher wird Unicode nicht so schnell ersetzt.

Um die Kompatibilität mit dem zu diesem Zeitpunkt bereits weit verbreiteten älteren ASCII zu gewährleisten, wurde Unicode so konzipiert, dass die ersten acht Bits mit denen der beliebtesten ASCII-Seite übereinstimmen. Wenn Sie also eine ASCII-codierte Datei mit Unicode öffnen, werden immer noch die richtigen Zeichen in der Datei codiert. Dies erleichterte die Einführung von Unicode, da die Auswirkungen der Einführung eines neuen Codierungsstandards für diejenigen, die bereits ASCII verwendeten, geringer wurden.

Zusammenfassung:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Entnommen aus: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


1

Lager

Die angegebenen Zahlen dienen nur zum Speichern von 1 Zeichen

  • ASCII ⟶ 2 7 Bits ( 1 Byte )
  • Erweitertes ASCII ⟶ 2 8 Bit (1 Byte)
  • UTF-8 ⟶ Minimum 2 8 , Maximum 2 32 Bit (min 1, max 4 Bytes)
  • UTF-16 ⟶ Minimum 2 16 , Maximum 2 32 Bit (min 2, max 4 Bytes)
  • UTF-32 ⟶ 2 32 Bit (4 Bytes)

Nutzung (Stand Februar 2020)

Prozentsatz der Websites, die verschiedene Zeichencodierungen verwenden


0

ASCII definiert 128 Zeichen, da Unicode ein Repertoire von mehr als 120.000 Zeichen enthält.


4
-1 für dieses triviale Duplikat "Antwort", das nichts zu viel früheren früheren Antworten hinzufügt. Bitte fügen Sie keine doppelte Unordnung wie diese hinzu (lassen Sie sich auf andere legitime Weise vertreten).
Cellepo

-1

Abgesehen davon, dass UTF eine Obermenge von ASCII ist, besteht ein weiterer wichtiger Unterschied zwischen ASCII und UTF in der Codierung von Datenträgerdateien sowie der Darstellung und Speicherung von Daten im Zufallsspeicher. Programme wissen, dass bestimmte Daten als ASCII- oder UTF-Zeichenfolge verstanden werden sollten, indem sie entweder am Anfang der Daten spezielle Byte-Ordnungsmarkierungscodes erkennen oder von der Absicht des Programmierers annehmen, dass die Daten Text sind, und sie dann auf Muster überprüfen, die darauf hinweisen, dass dies der Fall ist in der einen oder anderen Textcodierung.

Unter Verwendung der herkömmlichen Präfixnotation 0xfür hexadezimale Daten ist eine gute Referenz, dass ASCII-Text mit Bytewerten beginnt 0x00, 0x7Fum einen der möglichen ASCII-Zeichenwerte darzustellen . UTF-Text wird normalerweise angezeigt, indem mit den Bytes 0xEF 0xBB 0xBFfür UTF8 begonnen wird. Für UTF16 werden Startbytes verwendet 0xFE 0xFFoder 0xFF 0xFEverwendet, wobei die Endian-Reihenfolge der Textbytes durch die Reihenfolge der Startbytes angegeben wird. Das einfache Vorhandensein von Bytewerten, die nicht im ASCII-Bereich möglicher Bytewerte liegen, zeigt auch an, dass es sich bei den Daten wahrscheinlich um UTF handelt.

Es gibt andere Byte-Ordnungsmarken , die unterschiedliche Codes verwenden, um anzuzeigen, dass Daten als Text interpretiert werden sollten, der in einem bestimmten Codierungsstandard codiert ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.