Da ist str zu Unicode geworden Was ist mit CP932, wie es durch das herkömmliche Shift-JIS dargestellt wird?
Wenn bei der Standardausgabe unter Windows ein ASCII-Konvertierungsfehler auftritt. Ich habe es organisiert, um zu sehen, was es war.
Windows Python3 (Anaconda3)
In Python3 gibt es zwei Arten von Zeichenfolgen. Typ --str (nur Unicode) --byte Typ (beliebige Codierung)
str ist nur für UTF-8. Andere Codierungszeichenfolgen können nicht gespeichert werden. Auf der anderen Seite kann Byte jede kreisförmige Beschichtungszeichenfolge speichern. Natürlich ist auch UTF-8 möglich. Sie können mit encode () von str in byte konvertieren und mit decode () umgekehrt. Wenn Sie nicht wissen, welches welches ist, können Sie dir (str) ausführen. Es gibt keine zwei Arten von Funktionen wie in Python2.
In Python2 gibt es den Typ str und den Typ Unicode.
Python3-interne Windows-Standardausgabe(Eingang)
========== ===================
UTF-8 ----------------------> CP932
(str Typ) str.encode('CP932') (Bytetyp)
<----------------------
byte.decode('CP932')
Die Standardausgabe von Windows verwendet eine Codierung namens CP932. Wenn die Zeichenfolge str standardmäßig ausgegeben oder in eine Datei geschrieben wird, funktioniert die Konvertierung in CP932 daher standardmäßig automatisch.
Tatsächlich versucht Python, nach der automatischen Konvertierung in die Systemcodierung auszugeben, wenn Standardausgaben usw. ausgeführt werden, ohne explizit zu konvertieren.
Im Fall von Windows wird versucht, in CP932 zu konvertieren. Wenn es also nicht in CP932 konvertiert werden kann, tritt eine UnicodeEncodeError-Ausnahme auf.
>>> s = '\xa0'
>>> print(s)
>>> s.encode('utf-8')
b'\xc2\xa0'
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
Die Ursache für UnicodeEncodeError ist, dass es Code enthält, der nicht in CP932 konvertiert werden kann. Wenn Sie also den Code löschen, der das Falsche tut, wird er möglicherweise behoben.
In diesem Fall ist \ xa0 fehlerhaft. Wenn Sie es also durch die Ersetzungsfunktion ersetzen, wird der Ausnahmefehler nicht angezeigt.
>>> s
'\xa0'
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
>>> s2 =s.replace('\xa0', '')
>>> s2.encode('cp932')
b''
Es ist mühsam und einfach, den Code zu verlieren, der nicht in CP932 konvertiert werden kann. Erstens dachte ich, dass es eine Option zum Ignorieren geben könnte, wenn sie nicht in eine Codierungsfunktion konvertiert werden könnte, und als ich sie googelte, gab es eine Ignorieroption.
[Referenz] Konvertierung in Byte-String https://docs.python.jp/3/howto/unicode.html (Zusätzlich zum Ignorieren gibt es Ersetzen, Ersetzen von Namen usw.)
Ein Beispiel für die Unterdrückung eines Ausnahmefehlers mithilfe der Option "Ignorieren".
>>> s.encode('cp932')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 0: illegal multibyte sequence
>>> s.encode('cp932', "ignore")
b''
Zeichenketten mit \ xa0 usw. werden in Python3 intern als UTF-8 verwaltet, sodass sie in Python problemlos verarbeitet werden können. In Fällen, in denen sie beispielsweise in einer Windows-Umgebung in CP932 konvertiert werden müssen. , Bei der Ausgabe als Standard oder bei der Ausgabe als Datei Unicode --> CP932 Der Konvertierungsprozess nach wird ausgeführt. Zu diesem Zeitpunkt tritt UnicodeEncodeError auf. Wenn Sie es also einmal mit der Option ignore codieren, in den Bytetyp konvertieren und mit decode an str zurückgeben, können Sie UnicodeEncodeError von nun an vermeiden. Wenn Sie in eine Datei schreiben, kann der Bytetyp nur im Binärmodus ausgegeben werden. Geben Sie daher beim Öffnen der Datei den Binärmodus ('wb' oder 'ab' anstelle von 'w' oder 'a') an. Beim Öffnen mit Codecs kann die Option zum Codieren und Ignorieren zum Zeitpunkt des Öffnens angegeben werden, und der str-Typ kann unverändert ausgegeben werden.
Beispiel für Standardausgabe:
import codecs
s = '\xa0'
b = s.encode('cp932', "ignore")
s_after = b.decode('cp932')
print(s_after)
Beispiel für die Dateiausgabe:
f = open('test', 'ab')
s = '\xa0'
b = s.encode('cp932', 'ignore')
f.write(b)
f.close()
Beispiel für die Ausgabe einer Datei mit Codecs:
import codecs
f = codecs.open('test', 'ab', 'cp932', 'ignore')
s = '\xa0'
f.write(s) #Wenn Sie Codecs verwenden, können Sie als str schreiben
f.close()
Python3 Unicode HOWTO https://docs.python.jp/3/howto/unicode.html
CP932 und UTF-8 https://android.googlesource.com/toolchain/benchmark/+/master/python/src/Modules/cjkcodecs/README
Recommended Posts