Heim > Artikel > Backend-Entwicklung > Python Black Magic-Kodierungskonvertierungsmethode
In diesem Artikel wird hauptsächlich die Codierungskonvertierung von Python Black Magic vorgestellt und die Methode der Python-Codierungskonvertierung analysiert.
Wir verwenden andere Sprachen, wenn die Bibliothek die Codierung durchführt Bei der Konvertierung gibt es normalerweise nur zwei (oder drei) Möglichkeiten, mit Zeichen umzugehen, die nicht verstanden werden können:
Eine Ausnahme auslösen
wird durch das alternative Zeichen
überspringen
source -> unicode -> destKonvertieren Sie zuerst die
-Zeichenfolge aus der ursprünglichen Kodierung In Unicode konvertieren. Konvertieren Sie dann Unicode in die Zielkodierung.
Im ersten Schritt verwenden wir im Allgemeinendecode() oder unicode() diese beiden Funktionen Fertig. Im zweiten Schritt verwenden wir zur Vervollständigung die Funktion
encode().
errors. Schauen Sie sich die offizielle Beschreibung an:
Fehler können angegeben werden, um einen anderen Fehler festzulegen
Die Standardeinstellung ist „streng“, was bedeutet, dass Kodierungsfehler auftreten
ein UnicodeDecodeError. Weitere mögliche Werte sind „ignore“ und „replace“
sowie alle anderen Name, der bei Codecs registriert ist.
in der Lage ist, UnicodeDecodeErrors zu verarbeiten.
strikter Standardwert. Wenn ein Codierungsfehler auftritt, wird UnicodeDecodeError ausgelöst.
Überspringen ignorieren.
ersetzen Ersetzen durch ?
Wird zur Behandlung von UnicodeDecodeError verwendet.
codecs.register_error(name, error_handler)Name:
Der Name des Fehlerhandlers . Wird zum Ausfüllen des Fehlerparameters der Dekodierfunktion verwendet. error_handler: Verarbeitungsfunktion. Diese Funktion akzeptiert einen Ausnahmeparameter.
Gibt ein Tupel zurück. Das erste ist die fehlerkorrigierte Zeichenfolge und das zweite ist die Startposition, um mit der Dekodierung fortzufahren. Werfen wir einen Blick auf die konkrete Implementierung:
Das Obige habe ich aus dem Internet kopiert
def cjk_error(e): if not isinstance(e, UnicodeDecodeError): raise TypeError("don't know how to handle %r" % exc) if exc.end + 1 > len(exc.object): raise TypeError('unknown codec ,the object too short!') ch1 = ord(exc.object[exc.start:exc.end]) newpos = exc.end + 1 ch2 = ord(exc.object[exc.start + 1:newpos]) sk = exc.object[exc.start:newpos] if 0x81<=ch1<=0xFE and (0x40<=ch2<=0x7E or 0x7E<=ch2<=0xFE): # GBK return (unicode(sk,'cp936'), newpos) if 0x81<=ch1<=0xFE and (0x40<=ch2<=0x7E or 0xA1<=ch2<=0xFE): # BIG5 return (unicode(sk,'big5'), newpos) raise TypeError('unknown codec !') codecs.register_error("cjk_replace", cjk_replace). Zuerst fand ich es sehr gut, aber später stellte ich fest, dass es ein sehr unreflektierter Algorithmus war.
Beispielsweise haben utf8 und gbk einen Schnittpunkt in den ersten beiden Bytes. Wenn eine utf8-Zeichenfolge mit der GBK-Kodierung dekodiert wird, tritt der Fehler ab dem dritten Byte auf (die ersten beiden Bytes können auch einem chinesischen Zeichen im GBK-Kodierungsbereich entsprechen). Zum Beispiel:
Für diese Situation wurden also die folgenden Verbesserungen vorgenommen:
a = "你" # utf8编码:'\xe4\xbd\xa0' c = unicode(a[:2],'gbk') # 正常返回 c = unicode(a, 'gbk') # UnicodeDecodeError 。错误发生在第三个字节
Natürlich ist diese Logik eigentlich nicht streng genug. Obwohl es etwas realistisch ist, mit dieser Anomalie der gemischten Codierung umzugehen.
import codec def cjk_replace(e): if not isinstance(e, UnicodeDecodeError): raise TypeError("invalid exception type %s" e) src = e.encoding if src in ('gbk','gb18030', 'big5'): beg = e.start - 2 if beg >= 0: try: return unicode(e.object[beg:e.end], 'utf8'), e.end + 1 except: pass if exc.end + 1 > len(exc.object): raise TypeError('unknown codec ,the object too short!') ch1 = ord(exc.object[exc.start:exc.end]) newpos = exc.end + 1 ch2 = ord(exc.object[exc.start + 1:newpos]) sk = exc.object[exc.start:newpos] if src != 'gbk' and 0x81<=ch1<=0xFE and (0x40<=ch2<=0x7E or 0x7E<=ch2<=0xFE): # GBK return (unicode(sk,'cp936'), newpos) if src != 'big5' and 0x81<=ch1<=0xFE and (0x40<=ch2<=0x7E or 0xA1<=ch2<=0xFE): # BIG5 return (unicode(sk,'big5'), newpos) raise TypeError('unknown codec !') codecs.register_error("cjk_replace", cjk_replace)
Das obige ist der detaillierte Inhalt vonPython Black Magic-Kodierungskonvertierungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!