(Windows) Causes et solutions de contournement pour UnicodeEncodeError dans Python 3

Contexte

Depuis que str est devenu Unicode Qu'en est-il du CP932 représenté par le Shift-JIS conventionnel?

Lorsqu'une erreur de conversion ascii se produit lors de la sortie en standard sous Windows. Je l'ai organisé pour voir ce que c'était.

environnement

Windows Python3 (Anaconda3)

Windows et Python et encodage

Encoating des chaînes Python

Dans Python3, il existe deux types de chaînes. --str type (Unicode uniquement)

str est pour UTF-8 uniquement. Les autres chaînes de codage ne peuvent pas être stockées. D'autre part, byte peut stocker n'importe quelle chaîne de caractères de revêtement circulaire. Bien sûr, UTF-8 est également possible. Vous pouvez convertir de str en octet avec encode () et vice versa avec decode (). Si vous ne savez pas lequel est lequel, vous pouvez faire dir (str). Il n'y a pas deux types de fonctions comme dans Python2.

En Python2, il existe un type str et un type unicode.

Sortie standard Windows interne Python3(contribution)
==========                  ===================

  UTF-8  ---------------------->  CP932
 (type de str)   str.encode('CP932')   (type d'octet)
         <----------------------
           byte.decode('CP932')

Encodage Windows

La sortie standard de Windows utilise un encodage appelé CP932. Par conséquent, lorsque la chaîne de caractères str est sortie en standard ou écrite dans un fichier, la conversion en CP932 fonctionne automatiquement par défaut.

Quelle est la raison pour laquelle vous ne pouvez pas imprimer?

En fait, même si Python ne convertit pas explicitement, lors de l'exécution de la sortie standard, etc., il se convertit automatiquement en encodage système, puis essaie de sortir.

Dans le cas de Windows, il tente de se convertir en CP932, donc s'il ne peut pas être converti en CP932, une exception UnicodeEncodeError se produit.

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

Effacez le mauvais code

La cause de UnicodeEncodeError est qu'il contient du code qui ne peut pas être converti en CP932, donc si vous supprimez le code qui fait la mauvaise chose, il peut être résolu.

Dans ce cas, \ xa0 est incorrect, donc si vous le remplacez par la fonction de remplacement, l'erreur d'exception n'apparaîtra pas.

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

Ignorez le mauvais code

Il est gênant et facile de divulguer le code qui ne peut pas être converti en CP932. En premier lieu, j'ai pensé qu'il pourrait y avoir une option à ignorer si elle ne pouvait pas être convertie en fonction d'encodage, et lorsque je l'ai recherchée sur Google, il y avait une option ignorer.

[Référence] Conversion en chaîne d'octets https://docs.python.jp/3/howto/unicode.html (En plus d'ignorer, il y a remplacer, remplacer le nom, etc.)

Un exemple de suppression d'une erreur d'exception à l'aide de l'option ignore.

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

Résumé

Les chaînes de caractères contenant \ xa0 etc. sont gérées en interne comme UTF-8 dans Python3, elles peuvent donc être traitées sans problème en Python, mais dans les cas où elles doivent être converties en CP932 dans un environnement Windows, par exemple. , Lors de la sortie standard ou lors de la sortie sous forme de fichier Unicode --> CP932 Le processus de conversion en est exécuté. À ce moment-là, UnicodeEncodeError se produira, donc si vous l'encodez une fois avec l'option ignore, le convertissez en type d'octet et le renvoyez en str avec décodage, vous pouvez désormais éviter UnicodeEncodeError. De plus, lors de l'écriture dans un fichier, le type d'octet ne peut être sorti qu'en mode binaire, spécifiez donc le mode binaire ('wb' ou 'ab' au lieu de 'w' ou 'a') lors de l'ouverture du fichier. Dans le cas de open using codecs, l'option encoding and ignore peut être spécifiée au moment de open, et le type str peut être sorti tel quel.

Exemple de sortie standard:

import codecs
s = '\xa0'
b = s.encode('cp932', "ignore")
s_after = b.decode('cp932')
print(s_after)

Exemple de sortie de fichier:

f = open('test', 'ab')
s = '\xa0'
b = s.encode('cp932', 'ignore')
f.write(b)
f.close()

Exemple de sortie d'un fichier à l'aide de codecs:

import codecs
f = codecs.open('test', 'ab', 'cp932', 'ignore')
s = '\xa0'
f.write(s) #Si vous utilisez des codecs, vous pouvez écrire comme str
f.close()

référence

Python3 Unicode HOWTO https://docs.python.jp/3/howto/unicode.html

CP932 et UTF-8 https://android.googlesource.com/toolchain/benchmark/+/master/python/src/Modules/cjkcodecs/README

Recommended Posts

(Windows) Causes et solutions de contournement pour UnicodeEncodeError dans Python 3
Python 3.6 sous Windows ... et vers Xamarin.
Lier Modelica et Python sous Windows
Python sur Windows
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Installez et exécutez Python3.5 + NumPy + SciPy sur Windows 10
Remarques sur l'installation de Python3 et l'utilisation de pip sous Windows7
Installez OpenCV 4.0 et Python 3.7 sur Windows 10 avec Anaconda
python basic ② sous windows
Installez python sur Windows
Mettre la liaison MeCab pour Python sur Windows, Mac et Linux avec pip
[Note] Installation de Python 3.6 + α sur Windows et RHEL
Installation de TensorFlow sur Windows Easy pour les débutants en Python
Installer Python et les bibliothèques pour Python sur MacOS Catalina
Installez Python (pour Windows)
Installez la version ZIP Python et pip sur Windows 10
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Construire l'extension Python E-Cell 4 sur Windows 7 (64 bits)
[Heroku] Mémo pour le déploiement d'applications Python à l'aide d'Heroku sous Windows [Python]
[Windows] [Python3] Installer python3 et Jupyter Notebook (anciennement ipython notebook) sous Windows
PIL en Python sur Windows8 (pour Google App Engine)
Procédure de création d'un environnement CDK sous Windows (Python)
Compilez et installez MySQL-python pour python2.7 sur Amazon Linux
Créez un environnement shell et python décent sur Windows
Pour ceux qui ne peuvent pas installer Python sur Windows XP
Activer Python virtualenv sous Windows
Exécutez Openpose sur Python (Windows)
Installer watchdog sur Windows + Python 3.3
Python sur Ruby et Ruby en colère sur Python
Installez Python et Flask (Windows 10)
Procédure d'installation de Python 3.6 [pour Windows]
Développement Python + Kivy sous Windows
F2py sur Miniconda pour Windows
Sphinx-autobuild (0.5.2) sous Windows7, Python 3.5.1, Sphinx 1.3.5
Installation de Python la plus rapide sous Windows
Créer un environnement Python sur Windows
Construire un environnement Python avec Windows
Pièges et solutions de contournement pour pandas.DataFrame.to_sql
J'ai exécuté python sur Windows
[Python] [Chainer] [Windows] Installer Chainer sous Windows
Utiliser Python sur Windows (PyCharm)
Installer dlib pour Python (Windows)
Jusqu'à ce que vous créiez Python Virtualenv sur Windows et lanciez Jupyter
Installer python et Visual Studio Code sur Windows10 (version d'avril 2020)
Créer Python3 pour Windows 10 sur ARM avec Visual Studio 2019 (x86) sur Windows 10 sur ARM
Mémo de construction de l'environnement Python sur Windows 10
Notes sur Python et les types de dictionnaire
Installation de Kivy sur Windows10 64 bits Python3.5
Construction de l'environnement Anaconda Python sous Windows 10
installation de python2.7 dans un environnement Windows 32 bits
Installez xgboost (version python) sur Windows
Installez Python sur Windows + pip + virtualenv
Construisez et installez OpenCV sur Windows
Installez Pytorch sur Blender 2.90 python sous Windows
Installation de Kivy-Designer sur Windows10 64 bits Python3.5
Mecab / Cabocha / KNP sur Python + Windows
Maîtriser le pip et la roue dans Windows
Installer l'environnement de développement Python sur Windows 10
Installez confluent-kafka pour Python sur Ubuntu
Fichier CGI Python créé sous Windows
Premiers pas avec Python 3.8 sous Windows