Maison  >  Article  >  développement back-end  >  Résumé du codage Python (type d'encodage, format, transcodage)

Résumé du codage Python (type d'encodage, format, transcodage)

高洛峰
高洛峰original
2017-03-01 13:30:261647parcourir

Cet article résume le codage Python en détail. Partagez-le avec tout le monde pour référence, comme suit :

[Soi-disant Unicode]

Unicode est un codage abstrait similaire à un jeu de symboles, qui stipule seulement qu'il contient le code binaire du symbole, mais ne précise pas comment ce code binaire doit être stocké. Autrement dit, il ne s’agit que d’une représentation interne et ne peut pas être enregistrée directement. Par conséquent, un format de stockage doit être spécifié lors du stockage, tel que utf-8 et utf-16, etc. En théorie, Unicode est un système de codage qui peut s'adapter à toutes les langues du monde. (Pas plus de détails sur les autres formats d'encodage)

[Code dit GB]

GB signifie « norme nationale », c'est-à-dire la norme nationale du peuple République de Chine. Le code GB est un codage pour les caractères chinois, notamment GB2312 (GB2312-80), GBK et GB18030. La plage de représentation s'étend de petite à grande et est fondamentalement rétrocompatible. De plus, nous rencontrons souvent un code appelé CP936, qui peut en réalité être grossièrement considéré comme GBK.

[Encodage du juge]

1. Utilisez isinstance(s, str) pour déterminer si une chaîne est une chaîne générale (str est une chaîne de type ascii, utf- 8, utf-16, GB2312, GBK, etc. sont toutes des chaînes de type ascii );

Utilisez isinstance(s, unicode) pour déterminer si une chaîne est une chaîne de codage unicode (codage unicode La chaîne est un unicode tapez une chaîne).

2. Utilisez type() ou .__class__

Lorsque l'encodage est correct :

Par exemple : stra = "中", puis utilisez le résultat de type(stra ) Il s'agit de , indiquant une chaîne de type ascii

Par exemple : strb = u"中", alors le résultat de l'utilisation de type(strb) est , indique une chaîne de type Unicode.


tmp_str = 'tmp_str'
print tmp_str.__class__   #<type &#39;str&#39;>
print type(tmp_str)    #<type &#39;str&#39;>
print type(tmp_str).__name__ #str
tmp_str = u&#39;tmp_str&#39;
print tmp_str.__class__   #<type &#39;unicode&#39;>
print type(tmp_str)    #<type &#39;unicode&#39;>
print type(tmp_str).__name__ #unicode


3. La meilleure façon est d'utiliser le jugement de Chardet, en particulier dans les opérations liées au Web, telles que l'exploration dans le contenu de la page HTML, la balise charset de la page indique uniquement le codage, qui est parfois incorrect, et certains caractères chinois dans le contenu de la page peuvent dépasser la plage de codage. Dans ce cas, il est plus pratique et plus précis d'utiliser la détection du jeu de caractères. .

(1) Méthode d'installation : Après avoir téléchargé chardet, placez le dossier chardet décompressé dans le répertoire Libsite-packages du répertoire d'installation de Python et utilisez import chardet dans le programme.

(2) Méthode 1 : Détecter tous les contenus pour déterminer l'encodage


import urllib2
import chardet
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
res_cont = res.read()
res.close()
print chardet.detect(res_cont) #{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


La valeur de retour de la fonction de détection est un dictionnaire contenant 2 paires clé-valeur, la première est la confiance de détection et la seconde est la forme de codage détectée.

(3) Méthode 2 : Détecter une partie du contenu pour déterminer l'encodage et améliorer la vitesse


import urllib2
from chardet.universaldetector import UniversalDetector
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
detector = UniversalDetector()
for line in res.readlines():
 #detect untill reach threshold
 detector.feed(line)
 if detector.done:
  break
detector.close()
res.close()
print detector.result
#{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


【Convertir l'encodage】

1. Convertir d'un encodage spécifique (ISO-8859-1 [code ASCII], utf-8, utf-16, GBK, GB2312, etc.) en Unicode. et utilisez-le directement unicode(s, charset) ou s.decode(charset), où charset est l'encodage de s (notez qu'unicode fera une erreur lors de l'utilisation de decode()) ; 🎜>


#将任意字符串转换为unicode
def to_unicode(s, encoding):
 if isinstance(s, unicode):
  return s
 else:
  return unicode(s, encoding)
Remarque : lors du décodage(), si un caractère illégal est rencontré (comme un espace pleine largeur non standard xa3xa0 ou xa4x57, la vraie largeur l'espace est xa1xa1), une erreur sera signalée.


Solution : Utilisez le mode 'ignorer', c'est-à-dire : stra.decode('...', 'ignore').encode('utf-8').

Explication : Le prototype de fonction de decode est decode([encoding],[errors='strict']), et le deuxième paramètre peut être utilisé pour contrôler la stratégie de gestion des erreurs.

Le paramètre par défaut est strict, ce qui signifie qu'une exception sera levée lorsque des caractères illégaux sont rencontrés ; s'il est défini sur ignorer, les caractères illégaux seront ignorés ; s'il est défini sur remplacer, les caractères illégaux seront remplacés par ?; défini sur xmlcharrefreplace , puis utilisez des références de caractères XML.

2. Pour convertir de l'Unicode en un encodage spécifique, utilisez directement s.encode(charset), où s est l'encodage Unicode et charset est l'encodage spécifique (notez que non Unicode fera une erreur lors de l'utilisation encode()) ;

3. Naturellement, lors de la conversion d'un encodage spécifique à un autre encodage spécifique, vous pouvez d'abord décoder en Unicode, puis encoder dans l'encodage final.

[Encodage de ligne de commande Python (encodage système)]

Utilisez le module de paramètres régionaux fourni avec Python pour détecter l'encodage par défaut de la ligne de commande (c'est-à-dire le encodage système) et Définir l'encodage de la ligne de commande :


import locale
#get coding type
print locale.getdefaultlocale() #(&#39;zh_CN&#39;, &#39;cp936&#39;)
#set coding type
locale.setlocale(locale.LC_ALL, locale=&#39;zh_CN.GB2312&#39;)
print locale.getlocale() #(&#39;zh_CN&#39;, &#39;gb2312&#39;)
indique que l'encodage interne du système actuel est cp936, ce qui est similaire à GBK. En fait, le codage système interne du chinois XP et WIN7 est cp936 (GBK).


[Encodage en code python]

1. Lorsque la chaîne en code python n'est pas spécifiée avec encodage, l'encodage par défaut est le même que l'encodage du code. fichier lui-même cohérent. Par exemple : si la chaîne str = 'Chinese' se trouve dans un fichier de code codé en utf8, la chaîne est codée en utf8 ; si elle se trouve dans un fichier gb2312, la chaîne est codée en gb2312. Alors, comment connaître l’encodage du fichier de code lui-même ? (1) Spécifiez vous-même l'encodage du fichier de code : ajoutez "#-*- coding:utf-8 -*-" en tête du fichier de code pour déclarer que le fichier de code est utf-8 codé. A ce stade, l'encodage des chaînes dont l'encodage n'est pas spécifié devient utf-8.

(2)在没有指定代码文件的编码时,创建代码文件时使用的是python默认采用的编码(一般来说是ascii码,在windows中实际保存为cp936(GBK)编码)。通过sys.getdefaultencoding()和sys.setdefaultencoding('...')来获取和设置该默认编码。


import sys
reload(sys)
print sys.getdefaultencoding() #ascii
sys.setdefaultencoding(&#39;utf-8&#39;)
print sys.getdefaultencoding() #utf-8


结合(1)和(2)做个试验:指定代码文件编码为utf-8时,用notepad++打开显示的是utf-8无DOM编码;未指定代码文件编码时,用notepad++打开显示的是ANSI编码(压缩编码,默认的保存编码形式)。

Résumé du codage Python (type dencodage, format, transcodage)

(3)如何永久地将python默认采用的编码设置为utf-8呢?有2种方法:

第一个方法:编辑site.py,修改setencoding()函数,强制设置为 utf-8;

第二个方法:增加一个名为 sitecustomize.py的文件,存放在安装目录下的\Lib\site-packages目录下

sitecustomize.py是在site.py被import执行的,因为 sys.setdefaultencoding()是在site.py的结尾处被删除的,所以可以在 sitecustomize.py使用 sys.setdefaultencoding()。

2、python代码中的字符串如果被指定了编码,举个例子:str = u'中文',该字符串的编码被指定为unicode(即python的内部编码)。

(1)这里有个误区需要注意!假如在py文件中有如下代码:


stra = u"中"
print stra.encode("gbk")


按上面说的stra是unicode形式,直接encode称gbk编码应该没问题啊?但是实际执行时会报错“UnicodeEncodeError: 'gbk' codec can't encode character u'\xd6' in position 0: illegal multibyte sequence”。

原因在于:python解释器在导入python代码文件并执行时,会先查看文件头有没有编码声明(例如#coding:gbk等)。如果发现声明,会将文件中的字符串都先解释成unicode的形式(这里先用默认编码gbk(cp936)将stra解码成unicode编码'd6d0'后保存),之后执行stra.encode('gbk')时,由于stra已经是unicode编码且'd6d0'在gbk的编码范围内,所以编码不会出现错误;如果文件头没有编码声明,则不会进行上述过程中的解码操作(这里就直接使用stra的unicode编码'd6'),之后执行stra.encode('gbk')时,由于'd6'不在gbk的编码范围所以报错。

(2)为避免这种类型的错误,最好在代码文件头上声明编码,或者麻烦点每次使用setdefaultencoding()。

(3)总的来说就是unicode是python解释器的内码,所有代码文件在导入并执行时,python解释器会先将字符串使用你指定的编码形式解码成unicode,然后再进行各种操作。所以不管是对字符串的操作,还是正则表达式,还是读写文件等等最好都通过unicode来进行。

【python中其他编码】

文件系统的编码:sys.getfilesystemencoding()
终端的输入编码:sys.stdin.encoding
终端的输出编码:sys.stdout.encoding

更多Résumé du codage Python (type dencodage, format, transcodage)相关文章请关注PHP中文网!

Déclaration:
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