Wenn Sie eine internationale Anwendung schreiben, die mehrere Sprachen verwendet, müssen Sie ein oder zwei Dinge über das Codieren wissen. Sie ist dafür verantwortlich, wie der Text auf dem Bildschirm angezeigt wird. Ich werde kurz über die Geschichte der Codierung und ihre Standardisierung sprechen, und dann werden wir über ihre Verwendung sprechen. Lassen Sie uns ein wenig auf die Theorie der Informatik eingehen.
Einführung in die Codierung
Computer verstehen nur Binärzahlen - Nullen und Einsen, das ist ihre Sprache. Nichts mehr. Eine Zahl wird als Byte bezeichnet, jedes Byte besteht aus acht Bits. Das heißt, acht Nullen und Einsen bilden ein Byte. In Computern läuft alles auf Binär - Programmiersprachen, Mausbewegungen, Tastenanschläge und alle Wörter auf dem Bildschirm. Aber wenn der Artikel, den Sie lesen, früher eine Reihe von Nullen und Einsen war, wie wurden dann Binärzahlen zu Text? Lass es uns herausfinden.
Eine kurze Geschichte der Codierung
Zu Beginn seiner Entwicklung war das Internet ausschließlich englischsprachig. Die Autoren und Benutzer mussten sich nicht um die Zeichen anderer Sprachen kümmern, und alle Anforderungen wurden vollständig durch die ASCII-Codierung (American Standard Code for Information Interchange) abgedeckt.
ASCII ist eine Tabelle zum Zuordnen von Binärsymbolen zu Alphabetzeichen. Wenn der Computer einen Eintrag wie folgt erhält:
01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
dann konvertiert es mit ASCII in die Phrase "Hallo Welt".
Ein Byte (acht Bit) war groß genug, um einen englischsprachigen Buchstaben sowie Steuerzeichen zu enthalten, von denen einige von Ferndruckern verwendet wurden. In jenen Jahren waren sie also nützlich (heute sind sie nicht mehr sehr nützlich). Steuerzeichen waren zum Beispiel 7 (0111 in binär), was dazu führte, dass der Computer ein Signal sendete; 8 (1000 in binär) - zeigt das zuletzt gedruckte Zeichen an; oder 12 (1100 in binär) - löschte den gesamten auf dem Videoterminal geschriebenen Text.
In jenen Tagen zählten Computer 8 Bits pro Byte (dies war nicht immer der Fall), so dass es kein Problem gab. Wir konnten alle Steuerzeichen, alle Zahlen und englischen Buchstaben speichern, und selbst es war noch Platz, da ein Byte 255 Zeichen codieren kann und ASCII nur 127 benötigt. Das heißt, es waren noch 128 Positionen in der Codierung unbenutzt.
So sieht eine ASCII-Tabelle aus. Binärzahlen codieren alle Groß- und Kleinbuchstaben von A bis Z und Zahlen von 0 bis 9. Die ersten 32 Stellen sind für nicht druckbare Steuerzeichen reserviert.
ASCII-Probleme
Die Positionen 128 bis 255 waren leer. Die Öffentlichkeit fragte sich, wie sie gefüllt werden sollten. Aber sie hatten alle unterschiedliche Ideen . Das American National Standards Institute (ANSI) formuliert Standards für verschiedene Branchen. Sie genehmigten die ASCII-Positionen von 0 bis 127. Niemand bestritt sie. Das Problem war mit dem Rest der Positionen.
Dies war es, was die Positionen 128-255 in den ersten IBM Computern besetzte:
Einige Kringel, Hintergrundsymbole, mathematische Operatoren und akzentuierte Symbole wie é. Die Entwickler anderer Computerarchitekturen unterstützten die Initiative jedoch nicht. Jeder wollte in der zweiten Hälfte von ASCII seine eigene Codierung implementieren.
Alle diese verschiedenen Endungen wurden als Codepages bezeichnet .
Was sind ASCII-Codepages?
Hier ist eine Sammlung von über 465 verschiedenen Codepages! Es gab sogar innerhalb derselben Sprache verschiedene Seiten, zum Beispiel für Griechisch und Chinesisch. Wie könnte dieses Durcheinander standardisiert werden? Oder zumindest zwischen verschiedenen Sprachen funktionieren lassen? Oder zwischen verschiedenen Codepages für dieselbe Sprache? In anderen Sprachen als Englisch? Die Chinesen haben über 100.000 Zeichen. ASCII kann nicht einmal alle aufnehmen, selbst wenn sie beschlossen haben, alle leeren Stellen für chinesische Schriftzeichen anzugeben.
Dieses Problem wurde sogar Mojibake (bnop, krakozyabry) genannt. Dies ist, was sie über verzerrten Text sagen, der bei Verwendung einer falschen Codierung erhalten wird. Übersetzt aus dem Japanischen bedeutet Mojibake "Zeichenkonvertierung".
Ein Beispiel für bnopni (krakozyabrov).
Eine Art Wahnsinn ...
Genau! Es gab keine Chance, die Daten zuverlässig zu konvertieren. Das Internet ist nur eine monströse Verbindung von Computern auf der ganzen Welt. Stellen Sie sich vor, alle Länder beschließen, ihre eigenen Standards zu verwenden. Beispielsweise akzeptieren griechische Computer nur Griechisch, während englische Computer nur Englisch senden. Es ist wie in einer leeren Höhle zu schreien, niemand kann dich hören.
ASCII war nicht mehr lebenslang ausreichend. Für das weltweite Internet musste etwas anderes geschaffen werden, sonst wären Hunderte von Codepages zu bearbeiten gewesen. Es sei denn , Sie wollen nicht auf diese Absätze lesen.
֎֏ 0590 ׀ׁׂ׃ׅׄ׆ׇ
So wurde Unicode geboren
Unicode steht für Universal Coded Character Set (UCS) und hat die offizielle ISO / IEC 10646-Bezeichnung. Normalerweise verwendet jedoch jeder den Unicode-Namen.
Dieser Standard half bei der Lösung von Problemen, die durch Codierung und Codepages verursacht wurden. Es enthält viele Codepunkte (Codepunkte), die Zeichen aus Sprachen und Kulturen auf der ganzen Welt zugewiesen sind. Das heißt, Unicode ist eine Reihe von Zeichen . Es kann verwendet werden, um dem Buchstaben, auf den wir uns beziehen möchten, eine Abstraktion zuzuordnen. Und das gilt für jedes Symbol, auch für ägyptische Hieroglyphen .
Jemand hat großartige Arbeit geleistet und jedes Zeichen in allen Sprachen mit eindeutigen Codes versehen. So sieht es aus:
«Hello World» U+0048 : H U+0065 : E U+006C : L U+006C : L U+006F : O U+0020 : U+0057 : W U+006F : O U+0072 : R U+006C : L U+0064 : D
Das U + -Präfix gibt an, dass dies ein Unicode-Standard ist und die Zahl eine binäre Konvertierung ist. Der Standard verwendet die hexadezimale Notation, bei der es sich um eine vereinfachte Darstellung von Binärzahlen handelt. Hier können Sie alles in das Feld eingeben und sehen, wie es in Unicode konvertiert wird. Und hier können Sie alle 143.859 Codepunkte bewundern.
Ich werde nur für den Fall klarstellen: Wir sprechen über ein großes Wörterbuch von Codepunkten, die allen Arten von Symbolen zugewiesen sind. Dies ist eine sehr große Menge von Symbolen, nichts weiter.
Es bleibt die letzte Zutat hinzuzufügen.
Unicode Transform Protocol (UTF)
UTF ist ein Protokoll zum Codieren von Codepunkten in Unicode. Es ist im Standard festgelegt und ermöglicht es Ihnen, jeden Codepunkt zu codieren. Es gibt jedoch verschiedene Arten von UTF. Sie unterscheiden sich in der Anzahl der Bytes, die zum Codieren eines Elements verwendet werden. UTF-8 verwendet ein Byte pro Punkt, UTF-16 verwendet zwei Bytes und UTF-32 verwendet vier Bytes.
Aber wenn wir drei verschiedene Codierungen haben, woher wissen wir, welche in einer bestimmten Datei verwendet wird? Hierzu wird eine Byte Order Mark (BOM) verwendet, die auch als Encoding Signature bezeichnet wird. Stückliste ist eine Zwei-Byte-Markierung am Anfang der Datei, die angibt, welche Codierung hier verwendet wird.
Im Internet wird UTF-8 am häufigsten verwendet Es ist auch so geschrieben, wie es im HTML5-Standard bevorzugt wird, daher werde ich ihm die größte Aufmerksamkeit schenken.
Dieser Graph wurde 2012 erstellt, UTF-8 wurde zur dominierenden Codierung. Und das ist es immer noch.
Die Grafik zeigt die Prävalenz von UTF-8.
Was ist UTF-8 und wie funktioniert es?
UTF-8 codiert in einem Byte jeden Unicode-Code Punkt 0 bis 127 (wie in ASCII). Das heißt, wenn Sie Ihr Programm mit ASCII geschrieben haben und Ihre Benutzer UTF-8 verwenden, werden sie nichts Außergewöhnliches bemerken. Alles wird wie vorgesehen funktionieren. Beachten Sie, wie wichtig dies ist. Wir mussten die Abwärtskompatibilität mit ASCII während der Masseneinführung von UTF-8 aufrechterhalten. Und diese Kodierung macht nichts kaputt.
Wie der Name schon sagt, besteht ein Codepunkt aus 8 Bits (ein Byte). Es gibt Zeichen in Unicode, die mehrere Bytes (bis zu 6) belegen. Dies wird als variable Länge bezeichnet. In verschiedenen Sprachen ist die spezifische Anzahl von Bytes unterschiedlich. In Englisch - 1, europäischen Sprachen (mit lateinischem Alphabet), Hebräisch und Arabischdargestellt durch zwei Bytes pro Codepunkt. Für Chinesisch, Japanisch, Koreanisch und andere asiatische Sprachen werden drei Bytes verwendet.
Wenn Sie ein Zeichen benötigen, das mehr als ein Byte belegt, wird ein Bitmuster verwendet, um den Übergang anzuzeigen. Dies bedeutet, dass das Zeichen in den nächsten mehreren Bytes fortgesetzt wird.
Und jetzt haben wir uns wie durch Zauberei darauf geeinigt, wie die sumerische Keilschrift (Habr zeigt sie nicht an) sowie die Emoji- Symbole zu codieren sind !
Zusammenfassend lesen wir zuerst die Stückliste, um die Codierungsversion zu bestimmen, konvertieren dann die Datei in Unicode-Codepunkte und zeigen dann die Zeichen aus dem Unicode-Satz an.
Endlich über UTF
Codes sind Schlüssel . Wenn ich die falsche Codierung poste, können Sie nichts lesen. Beachten Sie dies beim Senden und Empfangen von Daten. In unseren täglichen Tools wird dies oft abstrahiert, aber für uns Programmierer ist es wichtig zu verstehen, was unter der Haube vor sich geht.
Wie stellen wir die Codierung ein? Da HTML in Englisch geschrieben ist und fast alle Codierungen gut mit Englisch funktionieren, können wir die Codierung am Anfang des Abschnitts angeben
<had>
.
<html lang="en">
<head>
<meta charset="utf-8">
</head>
Es ist wichtig, dies ganz am Anfang zu tun
<had>
, da die HTML- Analyse von vorne beginnen kann, wenn derzeit die falsche Codierung verwendet wird. Die Codierungsversion finden Sie auch im Content-Type- Header der HTTP-Anforderung / Antwort.
Wenn das HTML-Dokument keine Erwähnung der Codierung enthält, bietet die HTML5-Spezifikation eine interessante Lösung wie das Sniffing von Stücklisten . Mit seiner Hilfe können wir die vom Byte Order Marker (BOM) verwendete Codierung bestimmen.
Das ist alles?
Unicode ist noch nicht vollständig. Wie bei jedem Standard fügen wir etwas hinzu, entfernen etwas, bieten etwas Neues an. Keine der Spezifikationen ist „vollständig“. Normalerweise gibt es 1-2 Veröffentlichungen pro Jahr. Die Beschreibung finden Sie hier .
Ich habe kürzlich über einen sehr interessanten Fehler gelesen, der mit der falschen Anzeige russischer Unicode-Zeichen auf Twitter zusammenhängt .
Wenn Sie bis zum Ende gelesen haben, dann sind Sie großartig. Ich schlage vor, Sie machen Ihre Hausaufgaben. Sehen Sie, wie Websites bei Verwendung der falschen Codierung beschädigt werden können. Ich nutzte dieseErweiterung für Google Chrome, änderte die Codierung und versuchte, verschiedene Seiten zu öffnen. Die Informationen waren völlig unlesbar. Probieren Sie es selbst aus, wie ein Baumstumpf aussieht. Dies hilft Ihnen zu verstehen, wie wichtig die Codierung ist.
Fazit
Während ich diesen Artikel schrieb, lernte ich Michael Everson kennen . Seit 1993 hat er über 200 Änderungen an Unicode vorgeschlagen und dem Standard Tausende von Zeichen hinzugefügt. Ab 2003 galt er als das produktivste Mitglied. Er allein hat das Gesicht von Unicode stark beeinflusst. Michael ist einer von denen, die das Internet so gemacht haben, wie wir es heute kennen. Sehr beeindruckend.
Ich hoffe, ich konnte Ihnen zeigen, wofür Codierungen gedacht sind, welche Probleme sie lösen und was passiert, wenn sie fehlschlagen.