Heim >Backend-Entwicklung >Python-Tutorial >Das Kodieren und Dekodieren von Zeichenfolgen löst das Problem verstümmelter Zeichen
Warum wird der Fehler „UnicodeEncodeError: ‚ASCII‘-Codec kann Zeichen an Position 0-1 nicht kodieren: Ordinalzahl nicht im Bereich (128)“ gemeldet? In diesem Artikel wird dieses Problem untersucht.
Die interne Darstellung von Zeichenfolgen in Python ist die Unicode-Codierung. Daher ist es bei der Codierungskonvertierung normalerweise erforderlich, Unicode als Zwischencodierung zu verwenden, dh zuerst Zeichenfolgen in anderen Codierungen in Unicode zu decodieren Konvertieren Sie sie von Encode Unicode in eine andere Codierung.
Die Funktion der Dekodierung besteht darin, andere kodierte Zeichenfolgen in Unicode-Kodierung umzuwandeln, z. B. str1.decode('gb2312'), was bedeutet, dass die gb2312-kodierte Zeichenfolge str1 in Unicode-Kodierung konvertiert wird.
Die Funktion der Kodierung besteht darin, die Unicode-Kodierung in andere kodierte Zeichenfolgen umzuwandeln, z. B. str2.encode('gb2312'), was bedeutet, dass die Unicode-kodierte Zeichenfolge str2 in die gb2312-Kodierung konvertiert wird.
Daher müssen Sie beim Transkodieren zunächst verstehen, welche Codierung die Zeichenfolge str hat, sie dann in Unicode decodieren und dann in andere Codierungen codieren
Die Standardcodierung der Zeichenfolge im Code ist dasselbe wie Die Codedateien selbst sind konsistent codiert.
Zum Beispiel: s='Chinese'
Wenn es sich um eine utf8-Datei handelt, ist die Zeichenfolge utf8-codiert. Wenn es sich um eine gb2312-Datei handelt, ist die Codierung gb2312. In diesem Fall müssen Sie zum Durchführen der Kodierungskonvertierung zunächst die Dekodierungsmethode verwenden, um sie in die Unicode-Kodierung zu konvertieren, und dann die Kodierungsmethode verwenden, um sie in andere Kodierungen zu konvertieren. Wenn keine bestimmte Kodierungsmethode angegeben ist, werden normalerweise Codedateien verwendet, die mit der Standardkodierung des Systems erstellt wurden.
Wenn die Zeichenfolge wie folgt definiert ist: s=u'Chinese'
Die Kodierung der Zeichenfolge wird als Unicode angegeben, was die interne Kodierung von Python ist und sich von der Codedatei selbst unterscheidet . Codierung hat damit nichts zu tun. Daher müssen Sie in diesem Fall für die Codierungskonvertierung nur die Codierungsmethode direkt verwenden, um sie in die angegebene Codierung zu konvertieren.
Wenn eine Zeichenfolge bereits Unicode ist, tritt beim Decodieren ein Fehler auf. Daher muss normalerweise beurteilt werden, ob die Codierungsmethode Unicode ist:
isinstance(s, unicode) #用来判断是否为unicode
Nicht-Unicode-Codierung verwenden str wird zum Kodieren verwendet, es wird ein Fehler gemeldet
Wie erhalte ich die Standardkodierung des Systems?
#!/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding()
Die Ausgabe dieses Programms unter englischem Windows. Die Ausgabekonsole selbst kann die Codierung der Zeichenfolge nicht anzeigen und es ist kein Problem mit dem Programm selbst.
Wenn Sie den folgenden Code in UliPad ausführen:
wird Folgendes angezeigt: UnicodeEncodeError: 'ASCII'-Codec kann Zeichen an Position 0-1 nicht kodieren: Ordnungszahl nicht im Bereich( 128). Dies liegt daran, dass das Konsoleninformationsausgabefenster von UliPad unter englischem Windows angezeigt wirds=u"中文" print s
Ändern Sie den letzten Satz in: print s.encode('gb2312')
Das Wort „Chinesisch“ kann korrekt ausgegeben werden.
Wenn der letzte Satz geändert wird in: print s.encode('utf8')
, dann ist die Ausgabe: xe4xb8xadxe6x96x87. Dies ist das Ergebnis der Ausgabe des Konsoleninformationsfensters, das utf8 ausgibt -kodierte Zeichenfolge gemäß ASCII-Kodierung.
unicode(str,'gb2312') ist dasselbe wie str.decode('gb2312'). Sie konvertieren beide gb2312-codierte str in Unicode-Codierung.
Sie können str.__class__ verwenden die Kodierungsform von str
Nachdem wir lange über das Prinzip gesprochen haben, wollen wir endlich ein Allheilmittel finden:)
Der Code lautet wie folgt:
#!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312')