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?
Antworten:
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).
quelle
echo 'ա' > file.txt
es tun oder die Datei mit einigen Editoren bearbeiten, fügen sie automatisch eine neue Zeile hinzu. Wenn Sie ausführenxxd file.txt
, ist das letzte Byte wahrscheinlich ein0a
Zeilenvorschub oder ein Zeilenvorschub.a
, zwei Bytes (oder ein Vielfaches von zwei).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.
quelle
In UTF-8 verwenden ASCII-Zeichen ein Byte, andere Zeichen zwei, drei oder vier Byte.
quelle
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.
quelle
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.
quelle
Windows 8.1 US / English-Datei mit einem einzelnen 'a', das mit dem Editor gespeichert wurde.
Datei mit einem einzelnen 'ա', das mit dem Editor gespeichert wurde
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.
quelle
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.
quelle