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:
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:
Ändern Sie das Dateiformat in UTF-8: Ergebnis: abc涓枃Hier ist natürlich eine Dekodierung erforderlich: # programming=gbk
Codecs importierenprint open("Test.txt").read().decode("utf-8")Ergebnis: abc Chinesischoben 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!