Python résout le problème du codage des caractères chinois : Unicode Decode Error_python

高洛峰
Libérer: 2017-02-23 15:53:00
original
3461 Les gens l'ont consulté

Avant-propos

Récemment, en raison des besoins du projet, j'ai besoin de lire un document txt contenant des caractères chinois, et après cela, je dois enregistrer le fichier. Le document était auparavant codé en base64, ce qui faisait que tous les caractères chinois étaient lus et affichés sous forme de caractères tronqués. Après que l'équipe du projet a abandonné base64, deux erreurs se sont produites successivement :

ascii codec can't encode characters in position ordinal not in range 128
UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。
Copier après la connexion

Si vous ne connaissez pas ascii, unicode et utf-8, vous pouvez lisez cet article précédent sur les chaînes et l'encodage

Ensuite, vous devez comprendre les trois concepts suivants :

  1. ascii uniquement Peut représenter des chiffres, des lettres anglaises et certains symboles spéciaux, mais ne peuvent pas représenter les caractères chinois

  2. Unicode et utf-8 peuvent représenter des caractères chinois, l'unicode est une longueur fixe et utf-8 est une longueur variable

  3. La méthode de stockage en mémoire est généralement Unicode, tandis que la méthode de stockage des fichiers sur disque est généralement utf-8, car utf-8 peut économiser de l'espace de stockage

Alors quel est l'encodage par défaut de python ?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module &#39;sys&#39; (built-in)>
>>> sys.setdefaultencoding(&#39;utf-8&#39;)
>>> sys.getdefaultencoding()
&#39;utf-8&#39;
Copier après la connexion

L'encodage par défaut de python est ascii, et vous pouvez définir l'encodage par défaut de python via la fonction sys.setdefaultencoding(&#39;utf-8&#39;).

En python, vous pouvez modifier l'encodage des données via l'encodage et le décodage, par exemple :

>>> u&#39;汉字&#39;
u&#39;\u6c49\u5b57&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;)
&#39;\xe6\xb1\x89\xe5\xad\x97&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;).decode(&#39;utf-8&#39;)
u&#39;\u6c49\u5b57&#39;
Copier après la connexion

Nous pouvons utiliser ces deux fonctions Définir l'encodage.

Alors, quel est le type str en python ?

>>> import binascii
>>> &#39;汉字&#39;
&#39;\xba\xba\xd7\xd6&#39;
>>> type(&#39;汉字&#39;)
<type &#39;str&#39;>
>>> print binascii.b2a_hex(&#39;汉字&#39;)
babad7d6
>>> print binascii.b2a_hex(u&#39;汉字&#39;)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;utf-8&#39;))
e6b189e5ad97
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;gbk&#39;))
babad7d6
Copier après la connexion

binascii convertit le binaire des données en ascii L'explication ci-dessus est la suivante : le type de "caractères chinois" est str, et le Le binaire est babad7d6 , le « caractère chinois » ne peut pas être converti en ascii, donc la première erreur au début est signalée. La solution est de le .encode('utf-8') en type str. Étant donné que ma ligne de commande utilise le codage GBK par défaut de Windows, lorsque tous les « caractères chinois » .encode(‘gbk&#39;) apparaissent, les résultats de sortie sont les mêmes que les résultats des « caractères chinois ».

Pour résumer, le str de python est en fait un type d'unicode. Le codage par défaut de python est ascii. Lors de la conversion de non-ascii en ascii, une erreur sera signalée :

<🎜. >
  1. unicode => encode('encodage approprié') => str

  2. str => decode('encodage approprié') => unicode


Il existe également un moyen simple, qui consiste à définir l'encodage dans l'en-tête du fichier, ce qui peut éviter bien des ennuis :

import sys
reloads(sys)
sys.setdefaultencoding(&#39;utf-8&#39;)
Copier après la connexion

Pour le deuxième problème, il y a une erreur lors de la lecture du fichier. Les fichiers UTF-8 ont deux modes : BOM et no BOM. La différence entre les deux semble être que le fichier BOM a un en-tête de plus que le fichier sans BOM, provoquant une erreur lors de la lecture du fichier en mode UTF-8. J'ai déjà essayé de lire le fichier. D'abord, jugez s'il existe une nomenclature et ignorez l'en-tête du fichier BOM. Ensuite, cela a échoué.

Vous devez demander de l'aide à Google. La méthode de fonctionnement spécifique consiste à utiliser la bibliothèque de codecs pour lire le fichier (je suppose que cette bibliothèque sert à détecter l'en-tête du fichier).

import codecs
codecs.open(file_name, "r",encoding=&#39;utf-8&#39;, errors=&#39;ignore&#39;)
Copier après la connexion

Pour les problèmes d'encodage, vous devez comprendre les principes de fonctionnement de l'ascii, de l'unicode et de l'utf-8.

Pour plus de solutions Python aux problèmes d'encodage des caractères chinois : articles liés à Unicode Decode Error_python, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!