Eingehende Analyse des verstümmelten chinesischen Python-Problems

高洛峰
Freigeben: 2017-01-13 16:07:13
Original
1117 Leute haben es durchsucht

In diesem Artikel wird „Ha“ als Beispiel verwendet, um alle Probleme zu erklären:
1 . UTF-8, E59388;
3. GBK,B9FE.
1. str und unicode in python
Chinesische Codierung in Python war schon immer ein sehr großes Problem, und es werden häufig Ausnahmen bei der Codierungskonvertierung ausgelöst.
Wenn Unicode in Python erwähnt wird, bezieht es sich im Allgemeinen auf Unicode-Objekte. Das Unicode-Objekt von 'haha' ist beispielsweise
u'u54c8u54c8'
Und str ist ein Byte-Array ist das Speicherformat nach der Codierung von Unicode-Objekten (kann utf-8, gbk, cp936, GB2312 sein). Hier handelt es sich nur um einen Byte-Stream ohne weitere Bedeutung. Wenn Sie den von diesem Byte-Stream angezeigten Inhalt sinnvoll gestalten möchten, müssen Sie das richtige Codierungsformat verwenden, dekodieren und anzeigen.
Zum Beispiel:

python 中文乱码问题深入分析

Das Unicode-Objekt ist in einem utf-8-codierten str-s_utf8 codiert. s_utf8 ist ein Byte-Array, das „xe5x93x88xe5x93x88“ speichert, aber das ist Nur ein Byte-Array. Wenn Sie es über die print-Anweisung ausgeben möchten, werden Sie enttäuscht sein.

Da die Implementierung der Druckanweisung den Ausgabeinhalt an das Betriebssystem überträgt, kodiert das Betriebssystem den Eingabebytestrom gemäß der Kodierung des Systems, was erklärt, warum die Zeichenfolge im UTF-8-Format „Haha“ ist. , lautet die Ausgabe „鍝獚搱“, da „xe5x93x88xe5x93x88“ von GB2312 interpretiert wird und als „鍝鍚搱“ angezeigt wird. Ich möchte noch einmal betonen, dass str ein Byte-Array aufzeichnet, bei dem es sich nur um ein bestimmtes Codierungsspeicherformat handelt. Das Format der Ausgabe in eine Datei oder des Ausdrucks hängt vollständig davon ab, wie es durch die Decodierungscodierung decodiert wird.

Hier ist eine kleine zusätzliche Erklärung zum Drucken: Wenn ein Unicode-Objekt zum Drucken übergeben wird, wird das Unicode-Objekt intern in die lokale Standardcodierung konvertiert (dies ist nur eine persönliche Vermutung)

2. Konvertierung von str- und Unicode-Objekten

Die Konvertierung von str- und Unicode-Objekten erfolgt durch Kodierung und Dekodierung. Die spezifische Verwendung ist wie folgt:

python 中文乱码问题深入分析

Konvertieren GBK 'haha' zu Unicode und dann zu UTF8

3. Setdefaultencoding

python 中文乱码问题深入分析

Wie im Democode oben gezeigt:


Wenn s (GBK-String) direkt in utf-8 codiert wird, wird eine Ausnahme ausgelöst, aber durch Aufrufen des folgenden Codes:

import sys

reload( sys)

sys.setdefaultencoding('gbk')

und dann kann die Konvertierung erfolgreich sein. Wenn beim Codieren und Decodieren von str und Unicode in Python ein str direkt in eine andere Codierung codiert wird, wird str zuerst in Unicode decodiert, und die verwendete Codierung ist die Standardcodierung. Im Allgemeinen ist die Standardcodierung ancii Im obigen Beispiel tritt bei der ersten Konvertierung im Code ein Fehler auf. Nach dem Festlegen der aktuellen Standardcodierung auf „gbk“ tritt kein Fehler auf.

Was reload(sys) betrifft, müssen wir es neu laden, da Python2.5 die sys.setdefaultencoding-Methode nach der Initialisierung löscht.

4. Bearbeiten Sie Dateien mit verschiedenen Kodierungsformaten

Erstellen Sie eine Datei test.txt. Das Dateiformat ist ANSI und der Inhalt ist:


abc Chinesisch

Verwenden Sie Python zum Lesen

# programming=gbk

print open("Test.txt").read()

Ergebnis: abc Chinesisch

Ändern Sie das Dateiformat in UTF-8:

Ergebnis: abc涓枃

Hier ist natürlich eine Dekodierung erforderlich:

# programming=gbk

Codecs importieren

print open("Test.txt").read().decode("utf-8")

Ergebnis: abc Chinesisch

oben Ich habe die test.txt mit Editplus bearbeitet, aber als ich sie mit dem in Windows integrierten Notepad bearbeitet und im UTF-8-Format gespeichert habe, hat

beim Ausführen einen Fehler gemeldet:

Traceback ( letzter Aufruf zuletzt):

Datei „ChineseTest.py“, Zeile 3, in

print open("Test.txt").read().decode("utf-8" )

UnicodeEncodeError: Der Codec „gbk“ kann das Zeichen „u'ufeff“ in Position 0 nicht kodieren: unzulässige Multibyte-Sequenz

Es stellt sich heraus, dass eine Software, wie z. B. Notepad, eine in UTF kodierte Datei speichert. 8 werden drei unsichtbare Zeichen (0xEF 0xBB 0xBF, BOM) am Anfang der Datei eingefügt.

Also müssen wir diese Zeichen beim Lesen selbst entfernen. Das Codecs-Modul in Python definiert diese Konstante:

# programming=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

Ergebnis: abc Chinesisch

5. Das Codierungsformat der Datei und die Rolle der Codierungsanweisung

Die Quelldatei Welche Auswirkung hat das Kodierungsformat auf die Deklaration von Strings? Dieses Problem hat mich schon lange beschäftigt, und jetzt habe ich endlich einige Hinweise. Das Codierungsformat der Datei bestimmt das Codierungsformat der in der Quelldatei deklarierten Zeichenfolge, zum Beispiel:

str = '. Haha'

print repr(str)

a. Wenn das Dateiformat utf-8 ist, ist der Wert von str: 'xe5x93x88xe5x93x88' (haha's utf-8-Kodierung)

b. Wenn das Dateiformat gbk ist, dann ist der Wert von str: 'xb9xfexb9xfe' (haha gbk-Kodierung)

Wie im ersten Abschnitt erwähnt, ist ein String in Python nur ein Byte-Array wenn a Wenn der str im Fall b an die gbk-codierte Konsole ausgegeben wird, wird er als verstümmelte Zeichen angezeigt: 鍝矚搱 und wenn der str im Fall b an die utf-8-codierte Konsole ausgegeben wird, werden verstümmelte Zeichen angezeigt wird auch angezeigt. Was ist das Problem? Nein, möglicherweise wird „xb9xfexb9xfe“ mit utf-8 dekodiert und angezeigt, sodass es leer ist. >_<

Nachdem wir über das Dateiformat gesprochen haben, sprechen wir über die Rolle der Codierungsanweisung. Am Anfang jeder Datei wird eine Anweisung wie #coding=gbk verwendet, um die Codierung zu deklarieren Was nützt diese Aussage? Bisher denke ich, dass es drei Funktionen hat:

deklariert, dass in der Quelldatei Nicht-ASCII-Codierung angezeigt wird, normalerweise Chinesisch im erweiterten

in der IDE; Die IDE speichert Ihr Dateiformat in dem von Ihnen angegebenen Kodierungsformat.

Die Bestimmung des Kodierungsformats, das zum Dekodieren von „ha“ in Unicode für Deklarationen wie „u'ha“ im Quellcode verwendet wird, ist ebenfalls verwirrend. Siehe Beispiel:

#coding:gbk


ss = u'haha'

print repr(ss)

print 'ss:% s' % ss

Speichern Sie diese Codes in einem UTF-8-Text und führen Sie ihn aus. Was wird Ihrer Meinung nach ausgegeben? Der erste Eindruck eines jeden muss sein, dass die Ausgabe ist:

u'u54c8u54c8'

ss: Haha

Aber die tatsächliche Ausgabe ist:

u'u935du581du6431 '

ss:鍝埚搱

Warum passiert das? Zu diesem Zeitpunkt verursacht die Codierungsanweisung Probleme beim Ausführen von ss = u'haha', der gesamte Prozess kann unterteilt werden in die folgenden Schritte:

1) Holen Sie sich die Kodierung von „haha“: Wird durch das Dateikodierungsformat bestimmt, das „xe5x93x88xe5x93x88“ ist (die UTF-8-Kodierungsform von haha)

2) Bei der Konvertierung in die Unicode-Kodierung wird während dieses Konvertierungsvorgangs die Dekodierung von „xe5x93x88xe5x93x88“ nicht mit utf-8 dekodiert, sondern mit der bei der Deklaration „kodierung“ angegebenen Kodierung GBK. Das Ergebnis ist „鍝“. Beispielsweise lautet die Unicode-Kodierung dieser drei Zeichen u'u935du581du6431', was erklären kann, warum print repr(ss) u'u935du581du6431' ausgibt.

Okay, das ist etwas verwirrend, analysieren wir das nächste Beispiel:

#-*- programming:utf-8 -*-

ss = u'haha'

print repr(ss)

print 'ss:%s' % ss

Speichern Sie dieses Beispiel dieses Mal in GBK-Codierung, und das Ergebnis ist:

UnicodeDecodeError: 'utf8'-Codec kann Byte 0xb9 in Position 0 nicht dekodieren: unerwartetes Codebyte

Warum gibt es hier einen UTF8-Dekodierungsfehler? Denken Sie an das vorherige Beispiel und Sie werden es verstehen, da die Dateikodierung GBK ist und bei der Konvertierung die GBK-Kodierung „xb9xfexb9xfe“ erhalten wird Für Unicode wird UTF8 verwendet. Wenn Sie die UTF-8-Kodierungstabelle überprüfen, werden Sie feststellen, dass sie in der UTF8-Kodierungstabelle überhaupt nicht vorhanden ist (eine Erklärung von UTF-8 finden Sie hier). Beachten Sie die Hinweise zur Zeichenkodierung: ASCII, UTF-8, UNICODE), daher wird der obige Fehler gemeldet.


Für eine ausführlichere Analyse von verstümmelten Problemen mit Python-Chinesen und verwandten Artikeln achten Sie bitte auf die chinesische PHP-Website!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage