Maison développement back-end Tutoriel Python Python résout le problème du codage des caractères chinois : Unicode Decode Error_python

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

Feb 23, 2017 pm 03:53 PM

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 !

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Apr 02, 2025 am 07:18 AM

Comment enseigner les bases de la programmation novice en informatique dans les 10 heures? Si vous n'avez que 10 heures pour enseigner à l'informatique novice des connaissances en programmation, que choisissez-vous d'enseigner ...

Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Apr 02, 2025 am 07:15 AM

Comment éviter d'être détecté lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Apr 01, 2025 pm 11:15 PM

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Apr 01, 2025 pm 10:51 PM

Comment Uvicorn écoute-t-il en permanence les demandes HTTP? Uvicorn est un serveur Web léger basé sur ASGI. L'une de ses fonctions principales est d'écouter les demandes HTTP et de procéder ...

Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Apr 01, 2025 pm 11:18 PM

Dans Python, comment créer dynamiquement un objet via une chaîne et appeler ses méthodes? Il s'agit d'une exigence de programmation courante, surtout si elle doit être configurée ou exécutée ...

See all articles