Unicode

In diesem HOWTO wird die Unterstützung von Python für die Unicode-Spezifikation zur Darstellung von Textdaten erläutert und verschiedene Probleme erläutert, auf die bei der Arbeit mit Unicode häufig gestoßen wird. Einführung in Unicode Definitionen Heutige Programme müssen in der Lage sein, mit einer Vielzahl von Zeichen umzugehen. Anwendungen werden häufig internationalisiert, um Nachrichten anzuzeigen und in einer Vielzahl von vom Benutzer auswählbaren Sprachen auszugeben. Das gleiche Programm muss möglicherweise eine Fehlermeldung in Englisch, Französisch, Japanisch, Hebräisch oder Russisch ausgeben. Webinhalte können in jeder dieser Sprachen geschrieben werden und auch eine Vielzahl von Emoji-Symbolen enthalten. Der String-Typ von Python verwendet den Unicode-Standard zur Darstellung von Zeichen, mit dem Python-Programme mit all diesen verschiedenen möglichen Zeichen arbeiten können.

Unicode (https://www.unicode.org/) ist eine Spezifikation, die darauf abzielt, jedes von menschlichen Sprachen verwendete Zeichen aufzulisten und jedem Zeichen seinen eigenen eindeutigen Code zu geben. Die Unicode-Spezifikationen werden ständig überarbeitet und aktualisiert, um neue Sprachen und Symbole hinzuzufügen. Ein Zeichen ist die kleinstmögliche Komponente eines Textes. „A“, „B“, „C“ usw. sind unterschiedliche Zeichen. Dies gilt auch für „È“ und „Í“. Die Zeichen variieren je nach Sprache oder Kontext, über den Sie sprechen. Zum Beispiel gibt es ein Zeichen für „Roman Numeral One“, „Ⅰ“, das vom Großbuchstaben „I“ getrennt ist. Sie sehen normalerweise gleich aus, aber dies sind zwei verschiedene Zeichen, die unterschiedliche Bedeutungen haben.

Der Unicode-Standard beschreibt, wie Zeichen durch Codepunkte dargestellt werden. Ein Codepunktwert ist eine Ganzzahl im Bereich von 0 bis 0x10FFFF (ungefähr 1,1 Millionen Werte, die tatsächlich zugewiesene Anzahl ist kleiner als diese). In der Norm und in diesem Dokument wird ein Codepunkt unter Verwendung der Notation U + 265E geschrieben, um das Zeichen mit dem Wert 0x265e (9.822 in Dezimalzahl) zu bezeichnen.


Ein Zeichen wird auf einem Bildschirm oder auf Papier durch eine Reihe grafischer Elemente dargestellt, die als Glyphe bezeichnet werden. Die Glyphe für einen Großbuchstaben A besteht beispielsweise aus zwei diagonalen Strichen und einem horizontalen Strich, obwohl die genauen Details von der verwendeten Schriftart abhängen. Der meiste Python-Code muss sich nicht um Glyphen kümmern. Das Herausfinden der richtigen Glyphe für die Anzeige ist im Allgemeinen Aufgabe eines GUI-Toolkits oder des Font-Renderers eines Terminals.


Kodierungen Um den vorherigen Abschnitt zusammenzufassen: Eine Unicode-Zeichenfolge ist eine Folge von Codepunkten, bei denen es sich um Zahlen von 0 bis 0x10FFFF (1.114.111 Dezimalstellen) handelt. Diese Folge von Codepunkten muss im Speicher als Satz von Codeeinheiten dargestellt werden, und Codeeinheiten werden dann auf 8-Bit-Bytes abgebildet. Die Regeln zum Übersetzen einer Unicode-Zeichenfolge in eine Folge von Bytes werden als Zeichencodierung oder nur als Codierung bezeichnet. Die erste Codierung, an die Sie denken könnten, besteht darin, 32-Bit-Ganzzahlen als Codeeinheit zu verwenden und dann die Darstellung von 32-Bit-Ganzzahlen durch die CPU zu verwenden. In dieser Darstellung könnte die Zeichenfolge „Python“ folgendermaßen aussehen:

Daher wird diese Codierung nicht sehr häufig verwendet, und die Benutzer wählen stattdessen andere Codierungen, die effizienter und bequemer sind, wie z. B. UTF-8. UTF-8 ist eine der am häufigsten verwendeten Codierungen, und Python verwendet sie häufig standardmäßig. UTF steht für „Unicode Transformation Format“ und die „8“ bedeutet, dass 8-Bit-Werte in der Codierung verwendet werden. (Es gibt auch UTF-16- und UTF-32-Codierungen, diese werden jedoch weniger häufig als UTF-8 verwendet.) UTF-8 verwendet die folgenden Regeln: Wenn der Codepunkt <128 ist, wird er durch den entsprechenden Bytewert dargestellt. Wenn der Codepunkt> = 128 ist, wird er in eine Folge von zwei, drei oder vier Bytes umgewandelt, wobei jedes Byte der Folge zwischen 128 und 255 liegt. UTF-8 hat mehrere praktische Eigenschaften: Es kann jeden Unicode-Codepunkt verarbeiten. Eine Unicode-Zeichenfolge wird in eine Folge von Bytes umgewandelt, die nur eingebettete Nullbytes enthält, wenn sie das Nullzeichen darstellen (U + 0000). Dies bedeutet, dass UTF-8-Zeichenfolgen von C-Funktionen wie strcpy () verarbeitet und über Protokolle gesendet werden können, die für nichts anderes als Zeichenfolgenendmarkierungen null Byte verarbeiten können. Eine Zeichenfolge aus ASCII-Text ist auch gültiger UTF-8-Text. UTF-8 ist ziemlich kompakt; Die meisten häufig verwendeten Zeichen können mit einem oder zwei Bytes dargestellt werden. Wenn Bytes beschädigt sind oder verloren gehen, können Sie den Start des nächsten UTF-8-codierten Codepunkts bestimmen und neu synchronisieren. Es ist auch unwahrscheinlich, dass zufällige 8-Bit-Daten wie gültiges UTF-8 aussehen. UTF-8 ist eine byteorientierte Codierung. Die Codierung gibt an, dass jedes Zeichen durch eine bestimmte Folge von einem oder mehreren Bytes dargestellt wird. Dies vermeidet die Probleme bei der Bytereihenfolge, die bei ganzzahligen und wortorientierten Codierungen wie UTF-16 und UTF-32 auftreten können, bei denen die Reihenfolge der Bytes abhängig von der Hardware variiert, auf der die Zeichenfolge codiert wurde.

Seit Python 3.0 werden alle Zeichenfolgen als Unicode in einer Instanz des Typs str gespeichert. Codierte Zeichenfolgen werden dagegen als Binärdaten in Form von Instanzen des Bytetyps dargestellt. Konzeptionell bezieht sich str auf Text, während sich Bytes auf Daten beziehen. Verwenden Sie str.encode (), um von str zu Bytes zu wechseln, und bytes.decode (), um von Bytes zu str zu wechseln.

Codierungen werden als Zeichenfolgen angegeben, die den Namen der Codierung enthalten. Python wird mit ungefähr 100 verschiedenen Codierungen geliefert. Eine Liste finden Sie in der Python-Bibliotheksreferenz unter Standardcodierungen. Einige Codierungen haben mehrere Namen. Beispielsweise sind ‚latin-1‘, ‚iso_8859_1‘ und ‚8859‘ Synonyme für dieselbe Codierung. Einstellige Unicode-Zeichenfolgen können auch mit der integrierten Funktion chr () erstellt werden, die Ganzzahlen akzeptiert und eine Unicode-Zeichenfolge der Länge 1 zurückgibt, die den entsprechenden Codepunkt enthält. Die umgekehrte Operation ist die integrierte Funktion ord (), die eine einstellige Unicode-Zeichenfolge verwendet und den Codepunktwert zurückgibt: