Warum benötigen englische Zeichen zur Darstellung weniger Bytes als andere Alphabete?

31

Wenn ich 'a' in eine Textdatei einfüge, sind es 2 Bytes, aber wenn ich 'ա', einen Buchstaben aus dem armenischen Alphabet, einfüge, sind es 3 Bytes.

Was ist der Unterschied zwischen Alphabeten für einen Computer?
Warum nimmt Englisch weniger Platz ein?

khajvah
quelle
22
Sie sollten diesen Artikel des Gründers von StackExchange
Eric Lippert
22
Ich glaube nicht, dass es so etwas wie "englische Schriftzeichen" gibt. Sie sind Römer.
Raphael
5
@Raphael Jeder weiß, worauf er sich bezieht. Aber schön hinzuzufügen.
Mathias Lykkegaard Lorenzen
1
@Raphael Tatsächlich gibt es viele römische Buchstaben, die nicht auf Englisch verwendet werden und daher nicht im ASCII-Zeichensatz enthalten sind. Die meisten von ihnen enthalten Modifikatoren, die jedoch weiterhin benötigt werden, um Text in verschiedenen von Latein abgeleiteten Sprachen als Englisch korrekt wiederzugeben.
Wutaz
7
@Raphael Ich glaube nicht, dass es so etwas wie "römische Schriftzeichen" gibt. Sie sind lateinisch.
Blacklight Shining

Antworten:

41

Eines der ersten Kodierungsschemata, das für die Verwendung in Standardcomputern entwickelt wurde, ist der ASCII- Standard ( American Standard Code for Information Interchange ). Es wurde in den 1960er Jahren in den Vereinigten Staaten entwickelt.

Das englische Alphabet verwendet einen Teil des lateinischen Alphabets (zum Beispiel gibt es in Englisch nur wenige Wörter mit Akzent). Es gibt 26 einzelne Buchstaben in diesem Alphabet, ohne Berücksichtigung der Groß- und Kleinschreibung. Und in jedem Schema, das vorgibt, das englische Alphabet zu kodieren, müssten auch die einzelnen Zahlen und Satzzeichen vorhanden sein.

Die 1960er Jahre waren auch eine Zeit, in der Computer nicht so viel Arbeitsspeicher oder Festplattenspeicher hatten, wie wir jetzt haben. ASCII wurde als Standarddarstellung eines funktionalen Alphabets für alle amerikanischen Computer entwickelt. Die Entscheidung, jedes ASCII-Zeichen auf eine Länge von 8 Bit (1 Byte) festzulegen, wurde zu diesem Zeitpunkt aufgrund technischer Details getroffen (der Wikipedia-Artikel erwähnt die Tatsache, dass das perforierte Band jeweils 8 Bit an einer Position hielt). Tatsächlich kann das ursprüngliche ASCII-Schema unter Verwendung von 7 Bits übertragen werden, die acht könnten für Paritätsprüfungen verwendet werden. Spätere Entwicklungen erweiterten das ursprüngliche ASCII-Schema um mehrere akzentuierte, mathematische und endständige Zeichen.

Mit der weltweit zunehmenden Computernutzung hatten immer mehr Menschen aus verschiedenen Sprachen Zugang zu einem Computer. Dies bedeutete, dass für jede Sprache unabhängig von anderen Schemata neue Codierungsschemata entwickelt werden mussten, die sich widersprechen würden, wenn sie von verschiedenen Sprachendgeräten gelesen würden.

Unicode war eine Lösung für die Existenz verschiedener Terminals, indem alle möglichen sinnvollen Zeichen in einem einzigen abstrakten Zeichensatz zusammengefasst wurden.

UTF-8 ist eine Möglichkeit, den Unicode-Zeichensatz zu codieren. Es handelt sich um eine Codierung mit variabler Breite (z. B. können verschiedene Zeichen unterschiedliche Größen haben) und wurde aus Gründen der Abwärtskompatibilität mit dem früheren ASCII-Schema entwickelt. Als solches bleibt der ASCII-Zeichensatz ein Byte groß, während alle anderen Zeichen zwei oder mehr Bytes groß sind. UTF-16 ist eine weitere Möglichkeit, den Unicode-Zeichensatz zu codieren. Im Vergleich zu UTF-8 werden Zeichen entweder als Satz von einer oder zwei 16-Bit-Codeeinheiten codiert.

Wie in den Kommentaren angegeben, belegt das Zeichen 'a' ein einzelnes Byte, während 'ա' zwei Bytes belegt, was eine UTF-8-Codierung bezeichnet. Das zusätzliche Byte in Ihrer Frage war auf das Vorhandensein eines Zeilenumbruchs am Ende zurückzuführen (von dem das OP Kenntnis erlangt hat).

Doktoro Reichard
quelle
26
Es gibt kein letztes Byte, das das Ende der Datei in einer normalen Codierung oder einem Dateiformat codiert. Wenn ein Programm eine Datei liest, wird das Dateiende möglicherweise auf besondere Weise vom Betriebssystem gemeldet, dies ist jedoch ein anderes Problem.
Jukka K. Korpela
2
Das Zeichen ա ist 2 Byte (0xD5A1) in der UTF-8-Version von Unicode. Das zusätzliche Zeichen (was auch immer ist) ist in beiden Dateien vorhanden. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Neely
6
@khajvah Wenn Sie echo 'ա' > file.txtes tun oder die Datei mit einigen Editoren bearbeiten, fügen sie automatisch eine neue Zeile hinzu. Wenn Sie ausführen xxd file.txt, ist das letzte Byte wahrscheinlich ein 0aZeilenvorschub oder ein Zeilenvorschub.
Daniel Beck
7
@DoktoroReichard: Bitte stellen Sie in der Antwort klar, dass Unicode keine Kodierung ist; Vielmehr handelt es sich um einen abstrakten Zeichensatz, und UTF-16 und UTF-8 sind Codierungen von Unicode-Codepunkten. In den letzten Absätzen Ihrer Antwort geht es hauptsächlich um UTF-8. Wenn eine Datei jedoch UTF-16 verwendet, verwendet jeder Codepunkt, auch derjenige für a, zwei Bytes (oder ein Vielfaches von zwei).
Grawity
6
Es ist wahrscheinlich auch erwähnenswert, dass die "erweiterten ASCII" -Zeichensätze in Wirklichkeit überhaupt nicht ASCII sind, und die Anzahl der verschiedenen Möglichkeiten, das achte Bit zu verwenden, macht alles zu einem großen Chaos. Verwenden Sie stattdessen einfach UTF-8.
ntoskrnl
17

1 Byte ist 8 Bit und kann somit bis zu 256 (2 ^ 8) verschiedene Werte darstellen.

Für Sprachen, die mehr Möglichkeiten erfordern, kann eine einfache 1: 1-Zuordnung nicht verwaltet werden, sodass mehr Daten zum Speichern eines Zeichens erforderlich sind.

Beachten Sie, dass die meisten Codierungen im Allgemeinen die ersten 7 Bits (128 Werte) für ASCII- Zeichen verwenden. Damit bleibt das 8. Bit übrig, oder 128 weitere Werte für mehr Zeichen. . . Fügen Sie akzentuierte Zeichen, asiatische Sprachen, Kyrillisch usw. hinzu, und Sie können leicht erkennen, warum 1 Byte nicht ausreicht, um alle Zeichen zu behalten.

Ernie
quelle
Hier ist die einzige Antwort, die erklärt, warum mehr Speicherplatz verwendet wird
Félix Gagnon-Grenier
10

In UTF-8 verwenden ASCII-Zeichen ein Byte, andere Zeichen zwei, drei oder vier Byte.

Jason
quelle
1
Können Sie erläutern, warum dies so ist? Zwei Kodierungsmethoden zu erwähnen, beantwortet die Frage nicht ganz.
MaQleod
@MaQleod Unicode wurde erstellt, um ASCII zu ersetzen. Aus Gründen der Abwärtskompatibilität sind die ersten 128 Zeichen identisch. Diese 128 Zeichen können mit einem Byte ausgedrückt werden. Zusätzliche Bytes werden für zusätzliche Zeichen hinzugefügt.
Jason
Mir ist bewusst, aber das ist Teil der Antwort auf die Frage, was die ASCII-Zeichen anders macht. Es sollte dem OP erklärt werden.
MaQleod
@MaQleod Man könnte auch sagen, dass das Unicode-Konsortium hauptsächlich aus amerikanischen Unternehmen bestand und auf englischsprachige Schriftzeichen ausgerichtet war. Ich dachte, eine einfache Antwort sei besser als eine subjektive.
Jason
15
Nicht "in Unicode", sondern in UTF8 - das ist nur eine von mehreren Codierungen des Unicode-Zeichensatzes.
Sebastian Negraszus
3

Die Menge an Bytes, die für ein Zeichen benötigt wird (worum es anscheinend bei der Frage geht), hängt von der Zeichencodierung ab. Wenn Sie die ArmSCII-Codierung verwenden, belegt jeder armenische Buchstabe nur ein Byte. Heutzutage ist es jedoch keine gute Wahl.

Bei der UTF-8-Übertragungscodierung für Unicode benötigen Zeichen eine andere Anzahl von Bytes. Darin benötigt "a" nur ein Byte (die Vorstellung von zwei Bytes ist eine Art Verwirrung), "á" benötigt zwei Bytes und der armenische Buchstabe "ա" benötigt ebenfalls zwei Bytes. Drei Bytes müssen eine Art Verwirrung sein. Im Gegensatz dazu benötigt der bengalische Buchstabe „অ“ in UTF-8 drei Bytes.

Der Hintergrund ist einfach, dass UTF-8 für ASCII-Zeichen sehr effizient entwickelt wurde, für Schriftsysteme in Europa und Umgebung ziemlich effizient ist und der Rest weniger effizient ist. Dies bedeutet, dass für einfache lateinische Buchstaben (aus denen der englische Text meist besteht) nur ein Byte für ein Zeichen benötigt wird. Für Griechisch, Kyrillisch, Armenisch und einige andere werden zwei Bytes benötigt. Der Rest braucht mehr.

UTF-8 hat (wie in einem Kommentar hervorgehoben) auch die nützliche Eigenschaft, dass ASCII-Daten (wenn sie als 8-Bit-Einheiten dargestellt werden, was seit langer Zeit fast der einzige Weg war) trivial UTF-8-codiert sind.

Jukka K. Korpela
quelle
Danke für die Antwort. Zusätzliche Bytes entstehen, weil das von mir verwendete Programm am Ende automatisch neue Zeilenzeichen hinzufügt.
Khajvah
1
Ich denke, UTF-8 wurde nicht so sehr auf Effizienz bei ASCII-Daten als vielmehr auf Kompatibilität ausgelegt . UTF-8 hat die sehr nette Eigenschaft, dass 7-Bit-ASCII-Inhalt (mit dem auf Null gesetzten High-Bit) mit demselben Inhalt identisch ist, der wie UTF-8 codiert ist. Für Tools, die normalerweise mit ASCII arbeiten, ist dies also ein Ersatz . Meines Wissens hat kein anderes Unicode-Codierungsschema diese Eigenschaft. UTF-8 ist auch für die meisten Daten relativ kompakt, insbesondere wenn Sie sich im Bereich des Unicode-BMP befinden .
einen Lebenslauf vom
1
@ MichaelKjörling, ich habe einen Verweis auf diese Funktion hinzugefügt. Ein wesentlicher Einwand gegen Unicode in den Anfängen war jedoch die Ineffizienz, und UTF-16 verdoppelt die Datenmenge, bei der es sich überwiegend um ASCII-Daten handelt. UTF-8 bedeutet zB für englischen Text, dass Sie nur für die Nicht-ASCII-Zeichen „bezahlen“, die Sie verwenden.
Jukka K. Korpela
3

Zeichencodes waren in den 1960er Jahren (und darüber hinaus) maschinenspezifisch. In den 1980er Jahren verwendete ich kurzzeitig eine DEC 2020-Maschine, die 36-Bit-Wörter und 5, 6 und 8 ( IIRC ) -Bits pro Zeichencodierung enthielt . Davor habe ich eine IBM 370-Serie mit EBCDIC verwendet. ASCII mit 7 Bit brachte Ordnung, aber es kam zu einem Durcheinander mit IBM PC "Codepages", bei denen alle 8 Bit zur Darstellung zusätzlicher Zeichen verwendet wurden, wie alle Arten von Box-Drawing-Zeichen zum Zeichnen primitiver Menüs und spätere ASCII-Erweiterungen wie Latin-1 (8 Bit) Kodierungen, mit den ersten 7 Bits wie ASCII und der anderen Hälfte für "nationale Zeichen" wie ñ, Çoder andere. Die wahrscheinlich beliebteste war Latin-1, zugeschnitten auf Englisch und die meisten europäischen Sprachen mit lateinischen Zeichen (und Akzenten und Varianten).

Das Mischen von Texten, z. B. Englisch und Spanisch, ist in Ordnung (verwenden Sie einfach Latin-1, eine Obermenge von beiden), aber alles, was andere Kodierungen verwendet (z. B. einen Ausschnitt aus Griechisch oder Russisch, ganz zu schweigen von einer asiatischen Sprache wie Japanisch), wurde gemischt ein wahrer Albtraum. Das Schlimmste war, dass Russisch und insbesondere Japanisch und Chinesisch mehrere populäre, völlig inkompatible Kodierungen hatten.

Heute verwenden wir Unicode, das für effiziente Codierungen wie UTF-8 verwendet wird, die englische Zeichen bevorzugen (überraschenderweise entspricht die Codierung für englische Buchstaben zufällig ASCII), sodass viele nicht englische Zeichen längere Codierungen verwenden.

vonbrand
quelle
2

Windows 8.1 US / English-Datei mit einem einzelnen 'a', das mit dem Editor gespeichert wurde.

  • Speichern Sie AS ANSI 1 Byte
  • Speichern Sie AS Unicode 4 Bytes
  • Speichern Sie AS UTF-8 4 Bytes

Datei mit einem einzelnen 'ա', das mit dem Editor gespeichert wurde

  • Speichern als ANSI nicht möglich
  • Speichern Sie AS Unicode 4 Bytes
  • Speichern Sie AS UTF-8 5 Bytes

Ein einzelnes 'a' wird in ANSI als einzelnes Byte codiert. In Unicode besteht jedes Zeichen normalerweise aus 2 Byte. Am Anfang der Datei befindet sich außerdem eine 2-Byte-Stückliste (Byte Order Marker). UTF-8 hat eine 3-Byte-Stückliste und ein Einzelbyte-Zeichen.

Für das 'ա' existiert dieses Zeichen nicht im ANSI-Zeichensatz und kann nicht auf meinem Computer gespeichert werden. Die Unicode-Datei ist dieselbe wie zuvor, und die UTF-8-Datei ist 1 Byte größer, da das Zeichen 2 Byte benötigt.

Wenn Ihr Computer aus einer anderen Region stammt, ist möglicherweise eine andere OEM-Codepage mit unterschiedlichen Glyphen für die im ASCII-Bereich möglichen 255 Zeichen installiert. Wie @ntoskrnl erwähnte, wäre die OEM-Codepage für meinen Computer Windows-1252, was die Standardeinstellung für US-Englisch ist.

Darryl Braaten
quelle
4
Notepad (und Windows im Allgemeinen) verwendet hier eine verwirrende Terminologie. "ANSI" ist eine vom Gebietsschema abhängige Einzelbytecodierung (Windows-1252 bei englischen Versionen), und "Unicode" ist UTF-16.
ntoskrnl
@ntoskrnl Das ist richtig, aber wenn Sie in der Dropbox nach der Codierung suchen, steht dort ANSI, weshalb ich erwähnt habe, dass Sie bei einer anderen OEM-Codepage möglicherweise unterschiedliche Ergebnisse erhalten.
Darryl Braaten
2

Wenn Sie daran interessiert sind, wie Zeichen gespeichert werden, können Sie sich unter www.unicode.org umsehen. Am oberen Rand der Hauptseite befindet sich ein Link "Code Charts", der alle in Unicode verfügbaren Zeichencodes anzeigt.

Insgesamt sind in Unicode etwas mehr als eine Million Codes verfügbar (nicht alle werden verwendet). Ein Byte kann 256 verschiedene Werte enthalten, sodass Sie drei Bytes benötigen, wenn Sie jeden möglichen Unicode-Code speichern möchten.

Stattdessen wird Unicode normalerweise in der "UTF-8" -Codierung gespeichert, die für einige Zeichen weniger und für andere mehr Bytes verwendet. Die ersten 128 Codewerte werden in einem einzelnen Byte gespeichert, bis zu den ersten 2048 Codewerten werden in zwei Bytes gespeichert, bis zu 65536 werden in drei Bytes gespeichert, und der Rest benötigt vier Bytes. Dies wurde so eingerichtet, dass häufig verwendete Codewerte weniger Platz beanspruchen. AZ, az, 0-9 und! @ $% ^ & * () - [} {}; ': "|,. / <>? Und einige, die ich vergessen habe, nehmen ein Byte; fast alles Englisch, 98% von Deutsch und Französisch (nur Vermutung) können in einem Byte pro Zeichen gespeichert werden, und dies sind die Zeichen, die am häufigsten verwendet werden. Kyrillisch, Griechisch, Hebräisch, Arabisch und einige andere verwenden zwei Bytes pro Zeichen. Indische Sprachen, die meisten von Chinesisch, Japanisch , Koreanisch, Thai, Tonnen von mathematischen Symbolen, kann in drei Bytes pro Zeichen geschrieben werden. Seltene Dinge (falls Sie jemals Text in Linear A oder Linear B schreiben möchten, Emojis) benötigen vier Bytes.

Eine andere Kodierung ist UTF-16. Alles, was in UTF-8 1, 2 oder 3 Bytes benötigt, benötigt in UTF-16 zwei Bytes. Dies ist von Vorteil, wenn Sie chinesischen oder japanischen Text mit sehr wenigen lateinischen Zeichen dazwischen haben.

Zu den Gründen für das UTF-8-Design: Es hat mehrere Vorteile gegenüber anderen Designs. Sie sind:

Kompatibilität mit US-ASCII-Zeichen

Angemessene Kompaktheit

Selbstsynchronisation: Wenn Sie einen Teil einer Folge von Bytes erhalten, die Zeichen in UTF-8-Codierung sind, können Sie herausfinden, wo das Zeichen beginnt. In einigen Codierungen können sowohl xy als auch yx gültige Codierungen von Zeichen sein. Wenn Sie also einen Teil einer Sequenz erhalten ... xyxyxyxyxyxy ... können Sie nicht wissen, welche Zeichen Sie haben.

Richtige Sortierung: Wenn Sie Zeichenfolgen, die UTF-8-codierte Zeichen enthalten, nach ihren Bytewerten sortieren, werden sie automatisch richtig nach ihren Unicode-Werten sortiert.

Kompatibel mit Einzelbyte-Code: Die meisten Codes, die Einzelbyte-Werte annehmen, funktionieren automatisch korrekt mit UTF-8-codierten Zeichen.

Und was auch immer ich vergessen habe.

gnasher729
quelle