


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)
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
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é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‘>
>>> u‘中文‘.encode(‘utf-8‘) ‘\xe4\xb8\xad\xe6\x96\x87‘ >>> len(u‘中文‘.encode(‘utf-8‘)) 6
>>> s = u‘中文‘ >>> s = ‘中文‘.decode(‘utf-8‘) >>> s = unicode(‘中文‘, ‘utf-8‘) >>> type(u‘中文‘) <type ‘unicode‘>
>>> u‘中文‘ u‘\u4e2d\u6587‘ >>> len(u‘中文‘) 2
>>> isinstance(u‘中文‘, unicode) True >>> isinstance(‘中文‘, unicode) False >>> isinstance(‘中文‘, str) True >>> isinstance(u‘中文‘, str) False
>>> ‘中文‘.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‘)
É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‘) 中文
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é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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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 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é lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

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

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

Utilisation de Python dans Linux Terminal ...

Comprendre la stratégie anti-rampe d'investissement.com, Beaucoup de gens essaient souvent de ramper les données d'actualités sur Investing.com (https://cn.investing.com/news/latest-news) ...
