Maison  >  Article  >  développement back-end  >  Explication détaillée de la solution Python3 aux problèmes difficiles de codage de caractères

Explication détaillée de la solution Python3 aux problèmes difficiles de codage de caractères

PHPz
PHPzoriginal
2017-04-02 13:23:491463parcourir

L'une des améliorations les plus importantes de

Python3 est de résoudre le gros problème laissé par la string et l'encodage des caractères dans Python2. Pourquoi le codage Python est-il si pénible ? Certaines failles dans la conception des chaînes Python2 ont été introduites :
- L'utilisation du code ASCII comme méthode d'encodage par défaut est très peu conviviale pour le traitement chinois.
- Diviser de force les chaînes en deux types, unicode et str, trompant les développeurs

Bien sûr, ce n'est pas un bug Tant que vous faites plus attention lors du traitement, vous pouvez éviter ces pièges. Mais en Python3, les deux problèmes sont très bien résolus.

Tout d'abord, Python3 définit le codage par défaut du système sur UTF-8

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

Ensuite, les caractères de texte et les données binaires sont plus clairement distingués, représentés respectivement par str et octets. Tous les caractères de texte sont représentés par le type str. str peut représenter tous les caractères du jeu de caractères Unicode , tandis que les données d'octets binaires sont représentées par un nouveau type de données , représenté par des octets.

str

>>> a = "a"
>>> a
'a'
>>> type(a)
<class &#39;str&#39;>
>>> b = "禅"
>>> b
&#39;禅&#39;
>>> type(b)
<class &#39;str&#39;>

bytes

En Python3, ajoutez 'b' avant le caractère guillemet pour indiquer clairement qu'il s'agit d'un objet de type octets , en fait, il s'agit de données composées d'un ensemble de séquences d'octets binaires. Le type d'octets peut être des caractères de la plage ASCII et d'autres données de caractères sous forme hexadécimale, mais il ne peut pas être représenté par des caractères non-ASCII tels que le chinois.

>>> c = b&#39;a&#39;>>> c
b&#39;a&#39;>>> type(c)
<class &#39;bytes&#39;>

>>> d = b&#39;\xe7\xa6\x85&#39;>>> d
b&#39;\xe7\xa6\x85&#39;>>> type(d)
<class &#39;bytes&#39;>
>>>

>>> e = b&#39;禅&#39;
  File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.

Le type bytes fournit les mêmes opérations que str, prenant en charge des opérations telles que le partitionnement, l'indexation et les opérations numériques de base. Cependant, l'opération + ne peut pas être effectuée sur des données de type str et bytes, bien qu'elle soit réalisable dans py2.

>>> b"a"+b"c"
b&#39;ac&#39;
>>> b"a"*2
b&#39;aa&#39;
>>> b"abcdef\xd6"[1:]
b&#39;bcdef\xd6&#39;
>>> b"abcdef\xd6"[-1]
214
>>> b"a" + "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can&#39;t concat bytes to str

encoder et décoder

La conversion entre str et bytes peut être effectuée à l'aide des méthodes d'encodage et de décodage.

encode est responsable de la conversion du codage des caractères en octets. Par défaut, le codage UTF-8 est utilisé.

>>> s = "Python之禅"
>>> s.encode()
b&#39;Python\xe4\xb9\x8b\xe7\xa6\x85&#39;
>>> s.encode("gbk")
b&#39;Python\xd6\xae\xec\xf8&#39;

decode est responsable du décodage et de la conversion des octets en caractères, et utilise généralement le format de codage UTF-8 pour la conversion.

>>> b&#39;Python\xe4\xb9\x8b\xe7\xa6\x85&#39;.decode()
&#39;Python之禅&#39;
>>> b&#39;Python\xd6\xae\xec\xf8&#39;.decode("gbk")
&#39;Python之禅&#39;

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!

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