(Windows) Ursachen und Problemumgehungen für UnicodeEncodeError in Python 3

Hintergrund

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.

Umgebung

Windows Python3 (Anaconda3)

Windows und Python und Codierung

Python-Strings einhüllen

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')

Windows-Codierung

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.

Was ist der Grund, warum Sie nicht drucken können?

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

Löschen Sie den fehlerhaften Code

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''

Ignoriere den schlechten Code

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''

Zusammenfassung

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()

Referenz

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

(Windows) Ursachen und Problemumgehungen für UnicodeEncodeError in Python 3
Python 3.6 unter Windows ... und zu Xamarin.
Verknüpfen Sie Modelica und Python unter Windows
Python unter Windows
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Installieren Sie Python3.5 + NumPy + SciPy und führen Sie es unter Windows 10 aus
Hinweise zur Installation von Python3 und zur Verwendung von pip unter Windows7
Installieren Sie OpenCV 4.0 und Python 3.7 unter Windows 10 mit Anaconda
Python Basic ② in Windows
Installieren Sie Python unter Windows
Setzen Sie die MeCab-Bindung für Python unter Windows, Mac und Linux mit pip ein
[Hinweis] Installieren von Python 3.6 + α unter Windows und RHEL
Installieren von TensorFlow unter Windows Easy für Python-Anfänger
Installieren Sie Python und Bibliotheken für Python unter MacOS Catalina
Installieren Sie Python (für Windows)
Installieren Sie die ZIP-Version Python und Pip unter Windows 10
Grundeinstellungen für die Verwendung von Python3.8 und pip unter CentOS8
Erstellen Sie die Python-Erweiterung E-Cell 4 unter Windows 7 (64 Bit).
[Heroku] Memo zum Bereitstellen von Python-Apps mit Heroku unter Windows [Python]
[Windows] [Python3] Installieren Sie Python3 und Jupyter Notebook (ehemals Ipython Notebook) unter Windows
PIL in Python unter Windows8 (für Google App Engine)
Vorgehensweise zum Erstellen einer CDK-Umgebung unter Windows (Python)
Kompilieren und installieren Sie MySQL-Python für Python2.7 unter Amazon Linux
Erstellen Sie unter Windows eine anständige Shell- und Python-Umgebung
Für diejenigen, die Python unter Windows XP nicht installieren können
Aktivieren Sie Python virtualenv unter Windows
Führen Sie Openpose unter Python (Windows) aus.
Installieren Sie Watchdog unter Windows + Python 3.3
Python auf Ruby und wütend Ruby auf Python
Installieren Sie Python und Flask (Windows 10)
Installationsverfahren für Python 3.6 [für Windows]
Python + Kivy-Entwicklung unter Windows
F2py unter Miniconda für Windows
Sphinx-Autobuild (0.5.2) unter Windows7, Python 3.5.1, Sphinx 1.3.5
Schnellste Python-Installation unter Windows
Erstellen Sie eine Python-Umgebung unter Windows
Erstellen Sie eine Python-Umgebung mit Windows
Fallstricke und Problemumgehungen für pandas.DataFrame.to_sql
Ich habe Python unter Windows ausgeführt
[Python] [Chainer] [Windows] Chainer unter Windows installieren
Verwenden Sie Python unter Windows (PyCharm)
Installieren Sie dlib für Python (Windows)
Bis Sie Python Virtualenv unter Windows erstellen und Jupyter starten
Installieren Sie Python und Visual Studio Code unter Windows 10 (Version April 2020)
Erstellen Sie Python3 für Windows 10 unter ARM mit Visual Studio 2019 (x86) unter Windows 10 unter ARM
Python-Umgebungskonstruktionsnotiz unter Windows 10
Hinweise zu Python- und Wörterbuchtypen
Installieren von Kivy unter Windows 10 64bit Python3.5
Aufbau einer Anaconda-Python-Umgebung unter Windows 10
Python2.7-Installation in einer Windows 32-Bit-Umgebung
Installieren Sie xgboost (Python-Version) unter Windows
Installieren Sie Python unter Windows + pip + virtualenv
Erstellen und installieren Sie OpenCV unter Windows
Installieren Sie Pytorch unter Blender 2.90 Python unter Windows
Installieren von Kivy-Designer unter Windows 10 64-Bit Python3.5
Mecab / Cabocha / KNP unter Python + Windows
Rohr und Rad in Fenstern beherrschen
Installieren Sie die Python-Entwicklungsumgebung unter Windows 10
Installieren Sie Confluent-Kafka für Python unter Ubuntu
Unter Windows erstellte Python-CGI-Datei
Erste Schritte mit Python 3.8 unter Windows