Maison > développement back-end > Tutoriel Python > Explication détaillée de la différence et de l'analyse de l'utilisation entre str et Unicode dans le traitement de l'encodage Python

Explication détaillée de la différence et de l'analyse de l'utilisation entre str et Unicode dans le traitement de l'encodage Python

高洛峰
Libérer: 2017-03-16 16:23:46
original
1366 Les gens l'ont consulté

Utilisez python pour traiter le chinois, lors de la lecture de fichiers ou de messages, si des caractères tronqués (chaîne sont trouvés), lisez et écrivez des fichiers, print), ce que font la plupart des gens est d'appeler encode/decode pour le débogage sans réfléchir clairement à la raison pour laquelle les caractères tronqués apparaissent. Aujourd'hui, nous allons discuter de la façon de gérer les problèmes d'encodage.

Remarque : la discussion suivante concerne Python2. Erreur 2

Tout d'abord

doit avoir un concept général, comprendre le
Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)
Copier après la connexion
jeu de caractères<.>, codage des caractères

ASCII | Unicode | UTF-8 etc.
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode     return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)
Copier après la connexion

Notes sur le codage des caractères : ASCII, Unicode et UTF-8

str et unicode str et unicode sont tous deux des sous-classes de base

string

Il existe donc un moyen de déterminer s'il s'agit d'une chaîne

def is_str(s) : return isinstance (s, chaîne de base)

conversion str et unicode str -> decode('the_coding_of_str') -> unicode encode('the_coding_you_want') -> 🎜>

Différence

str est une chaîne d'octets, passée par unicode

Méthode de déclaration composée d'octets codés

Trouver la longueur (renvoie le nombre de octets)

unicode est le vrai sens Une chaîne composée de caractères

Méthode de déclaration

>>> s = ‘中文‘ s = u‘中文‘.encode(‘utf-8‘)  
>>> type(‘中文‘) <type ‘str‘>
Copier après la connexion
Trouver la longueur (retourner le nombre de caractères), quoi que vous voulez vraiment utiliser en logique

>>> u‘中文‘.encode(‘utf-8‘) ‘\xe4\xb8\xad\xe6\x96\x87‘ 
>>> len(u‘中文‘.encode(‘utf-8‘)) 
6
Copier après la connexion
Conclusion

Découvrez si vous souhaitez traiter str ou unicode, et utilisez la bonne méthode de traitement (str.decode/unicode.encode)

Voici la méthode pour déterminer si c'est unicode/str
>>> s = u‘中文‘ 
>>> s = ‘中文‘.decode(‘utf-8‘) 
>>> s = unicode(‘中文‘, ‘utf-8‘)  
>>> type(u‘中文‘) <type ‘unicode‘>
Copier après la connexion

Principe simple : n'utilisez pas encode pour str et n'utilisez pas decode pour unicode (en fait, str peut être encodé, voir la fin pour plus de détails. Pour garantir la simplicité, ce n'est pas recommandé)
>>> u‘中文‘ u‘\u4e2d\u6587‘ 
>>> len(u‘中文‘) 
2
Copier après la connexion

Conversion d'encodage différent, en utilisant Unicode comme encodage intermédiaire

le traitement de fichiers
>>> isinstance(u‘中文‘, unicode) True 
>>> isinstance(‘中文‘, unicode) False  
>>> isinstance(‘中文‘, str) True 
>>> isinstance(u‘中文‘, str) False
Copier après la connexion
, l'IDE et la console

flux de traitement, peuvent être utilisés comme ça, pensez à python comme un pool, Une entrée, une sortie
>>> ‘中文‘.encode(‘utf-8‘) 
Traceback (most recent call last): File "", line 1, in  UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe4 in position 0: ordinal not in range(128)  
>>> u‘中文‘.decode(‘utf-8‘) 
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode     return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)
Copier après la connexion

A l'entrée, tout est converti en Unicode, au pool tout est traité en Unicode, à la sortie, il est converti en encodage cible (bien sûr, il y a des exceptions, et des encodages spécifiques doivent être utilisés dans la logique de traitement) )

#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)
Copier après la connexion
Lire fichier Encodage d'entrée externe, décodage en Unicode Traitement (encodage interne, Unicode unifié) Encodage dans l'encodage cible requis Écrire dans la sortie cible (fichier ou console)

IDE et La console signale une erreur La raison est que lorsque. lors de l'impression, l'encodage est incompatible avec le propre encodage de l'EDI

Convertissez l'encodage en un encodage cohérent lors de la sortie et la sortie peut être normale. Encodage standard

Encodage uniforme pour éviter les caractères tronqués causés par un certain lien

Encodage d'environnement, IDE/texte

Éditeur

, encodage de fichiers, encodage de table de données de base de données

Assurer l'encodage du fichier source du code

Ceci est très important
>>> print u‘中文‘.encode(‘gbk‘) ???? 
>>> print u‘中文‘.encode(‘utf-8‘) 中文
Copier après la connexion

L'encodage par défaut du fichier py est ASCII Dans le fichier de code source, si des caractères non-ASCII sont utilisés, ils doivent l'être. encodé dans l'en-tête du fichier Document de déclaration

S'il n'est pas déclaré, des erreurs seront rencontrées lors de la saisie non-ASCII, qui doit être placé sur la première ou la deuxième ligne du fichier

Déclaration méthode

Si l'en-tête déclare coding=utf-8, a = 'Chinese', son encodage est utf-8

Si l'en-tête déclare coding=gb2312, a = 'Chinese ', son encodage est gbk

ainsi, tous les en-têtes de fichiers sources d'un même projet ont un encodage unifié, et l'encodage déclaré doit être cohérent avec l'encodage enregistré dans le fichier source (lié à l'éditeur)

est utilisé comme chaîne codée en dur pour le traitement dans le code source, utilisez uniformément Unicode

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理

if s == u‘中文‘:  #而不是 s == ‘中文‘     pass #注意这里 s到这里时,确保转为unicode
Copier après la connexion

以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)

处理顺序

1. Decode early 2. Unicode everywhere 3. Encode later 

相关模块及一些方法

获得和设置系统默认编码

>>> import sys 
>>> sys.getdefaultencoding() ‘ascii‘  
>>> reload(sys) <module ‘sys‘ (built-in)> 
>>> sys.setdefaultencoding(‘utf-8‘) 
>>> sys.getdefaultencoding() ‘utf-8‘ 
>>> str.encode(‘other_coding‘)
Copier après la connexion

在python中,直接将某种编码的str进行encode成另一种编码str

#str_A为utf-8 str_A.encode(‘gbk‘)  执行的操作是 str_A.decode(‘sys_codec‘).encode(‘gbk‘) 这里sys_codec即为上一步 sys.getdefaultencoding() 的编码 

‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些

chardet

文件编码检测,下载

>>> import chardet 
>>> f = open(‘test.txt‘,‘r‘) 
>>> result = chardet.detect(f.read()) 
>>> result {‘confidence‘: 0.99, ‘encoding‘: ‘utf-8‘}
Copier après la connexion

\u字符串转对应unicode字符串

>>> u‘中‘ u‘\u4e2d‘  
>>> s = ‘\u4e2d‘ 
>>> print s.decode(‘unicode_escape‘) 中  
>>> a = ‘\\u4fee\\u6539\\u8282\\u70b9\\u72b6\\u6001\\u6210\\u529f‘ 
>>> a.decode(‘unicode_escape‘) u‘\u4fee\u6539\u8282\u70b9\u72b6\u6001\u6210\u529f‘
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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