Maison > Article > développement back-end > 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
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 leTraceback (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)jeu de caractères<.>, codage des caractèresASCII | 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)
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
conversion str et unicode str -> decode('the_coding_of_str') -> unicode encode('the_coding_you_want') -> 🎜>
Différencestr est une chaîne d'octets, passée par unicode Méthode de déclaration composée d'octets codésTrouver 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‘>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‘)) 6Conclusion 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‘>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‘中文‘) 2Conversion 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, 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)
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‘)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) Convertissez l'encodage en un encodage cohérent lors de la sortie et la sortie peut être normale. Encodage standardEncodage uniforme pour éviter les caractères tronqués causés par un certain lienEncodage d'environnement, IDE/texte
Éditeur
, encodage de fichiers, encodage de table de données de base de donnéesAssurer l'encodage du fichier source du codeCeci est très important
>>> print u‘中文‘.encode(‘gbk‘) ???? >>> print u‘中文‘.encode(‘utf-8‘) 中文
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éthodeSi 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
以上几步搞定后,你只需要关注两个 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‘)
在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‘}
\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‘
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!