Python2 str / unicode et encoder / décoder

introduction

Les chaînes Python2 sont déroutantes.

le terme

En premier lieu, non seulement Python mais aussi les histoires liées au code de caractère sont compliquées. C'est probablement parce que les gens utilisent des termes différents. Ici, [Yukihiro Matsumoto Code World](http://www.amazon.co.jp/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3% 82% 86% E3% 81% 8D% E3% 81% B2% E3% 82% 8D-% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 81% AE% E4% B8 % 96% E7% 95% 8C% E2% 80% BE% E3% 82% B9% E3% 83% BC% E3% 83% 91% E3% 83% BC% E3% 83% BB% E3% 83% 97 % E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9E% E3% 81% AB% E3% 81% AA% E3% 82% 8B14% E3% 81% AE% E6 % 80% 9D% E8% 80% 83% E6% B3% 95 / dp / 4822234312 Selon la définition suivante dans "Yukihiro Matsumoto Code World").

le terme sens
lettre Symboles utilisés dans les systèmes qui représentent visuellement la langue
Glyphe Forme de caractère de caractères individuels
Jeu de caractères Une collection de caractères soumis à l'attribution de code de caractère
Code de caractère Numéros attribués à des caractères individuels
Méthode de codage des caractères Comment exprimer le code de caractère sur l'ordinateur

Deux types de chaînes de caractères

Il existe deux types de chaînes dans Python2. Ici, les deux sont appelées ** chaîne de caractères str ** et ** chaîne de caractères unicode **, et elles sont collectivement appelées ** chaîne de caractères **. Les termes ne sont pas très unifiés dans les documents officiels, je les appellerai donc ainsi pour le moment.

Tout d'abord, vous devez essentiellement utiliser des chaînes unicode.

chaîne de caractères

>>> 'Ah'
'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
>>> 'Ah'[0]
'\xe3'
>>> 'Ah'[1]
'\x81'
>>> 'Ah'[2]
'\x82'
>>> 'Ah'[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> len('Ah')
9

chaîne unicode

>>> u'Ah'
u'\u3042\u3044\u3046'
>>> u'Ah'[0]
u'\u3042'
>>> u'Ah'[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> len(u'Ah')
3

Résumé

Comme mentionné ci-dessus, la chaîne str présente les deux inconvénients suivants.

D'un autre côté, avec les chaînes Unicode, vous n'avez pas à vous en soucier. Par conséquent, vous devez utiliser la chaîne unicode au lieu de la chaîne str.

Examiner le type d'un objet chaîne

Utilisez ʻisinstance (object, str) et ʻisinstance (object, unicode) pour savoir si un objet est une chaîne str et une chaîne unicode. Il n'est pas recommandé de rechercher le type par «type (objet)».

>>> isinstance(u'Ah', unicode)
True
>>> isinstance('Ah', str)
True
>>> isinstance('Ah', unicode)
False
>>> isinstance(u'Ah', str)
False

Convertir le type d'un objet chaîne

str string ↔ unicode Il existe deux façons de convertir des chaînes entre elles: en utilisant une fonction intégrée appelée str / unicode et en utilisant la méthode d'encode / decode. Tout d'abord, vous devez essentiellement utiliser la méthode d'encodage / décodage.

str/unicode

Python2 a deux fonctions intégrées, str () et ʻunicode () `.

La Référence de str () dit:

str([object]) Renvoie une chaîne contenant une belle représentation imprimable de l'objet. ...

ʻUnicode () `[Référence](http://docs.python.jp/2.7/library/functions.html#unicode" 2. Fonctions intégrées - Documentation Python 2.7ja1 ") se présente comme suit.

unicode([object[, encoding[, errors]]]) ... Si aucun paramètre facultatif n'est donné, unicode () imite le comportement de str (). Cependant, il renvoie une chaîne Unicode au lieu d'une chaîne de 8 bits. ...

En bref, str () et ʻunicode () `sont des méthodes pour renvoyer des chaînes de caractères et des chaînes Unicode qui représentent des objets, pas pour convertir des chaînes de caractères et des chaînes Unicode entre elles. Qu'il n'y en a pas.

De plus, comme ces fonctions sont conçues pour appeler les méthodes spéciales «str ()» et «unicode ()» pour les objets définis, leur comportement diffère selon l'objet.

encode/decode

Les objets String ont les méthodes ʻencode () et decode () `. Ceci est souvent expliqué comme suit.

Ce n'est pas faux, mais la chaîne str a en fait une méthode ʻencode () , et la chaîne unicode a également une méthode decode () . Donc, si vous faites "Ah". Encode () , des choses étranges comme ʻUnicodeDecodeError` se produiront.

Afin d'étudier le comportement de ʻencode () et decode () , j'ai appelé ʻencode () et decode () pour diverses combinaisons de chaînes de caractères et de méthodes d'encodage. L'expérience a été menée dans un environnement de dialogue. La méthode de codage d'entrée / sortie du terminal est UTF-8.

Par exemple, la masse d'intersection de "'abc" et de ".encode (" ascii ")" indique la sortie lorsque "" abc ".encode (" ascii ")" est entré dans l'interpréteur.

Méthode \ string 'abc' u'abc' 'Ah' u'Ah'
.encode('ascii') 'abc' 'abc' Erreur(1) Erreur(3)
.encode('utf-8') 'abc' 'abc' Erreur(1) '\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
.encode('shift-jis') 'abc' 'abc' Erreur(1) '\x82\xa0\x82\xa2\x82\xa4'
.decode('ascii') u'abc' u'abc' Erreur(1) Erreur(3)
.decode('utf-8') u'abc' u'abc' u'\u3042\u3044\u3046' Erreur(3)
.decode('shift-jis') u'abc' u'abc' Erreur(2) Erreur(3)

Comme vous pouvez le voir sur ce résultat, ʻUnicodeDecodeErrorapparaît même si vous appelez ʻencode (), et ʻUnicodeEncodeError apparaît même si vous appelez decode ()`.

Même si vous regardez Reference, les spécifications n'ont pas été écrites, donc on devine, mais str Si vous appelez ʻencode () sur une chaîne de caractères, il arrivera que vous la décodiez avec la méthode de codage ASCII et que vous la codiez à nouveau avec la méthode de codage spécifiée. Lorsque la chaîne de caractères unicode est decode ()`, le contraire (codage avec la méthode de codage ASCII → décodage avec la méthode de codage spécifiée) est considéré comme se produisant. (S'il vous plaît dites-moi si vous faites une erreur)

Résumé

Pour la conversion de type entre les chaînes str et unicode, vous devez utiliser la méthode encode / decode au lieu de la fonction intégrée str / unicode.

La compréhension de la méthode d'encode / decode est que ʻencode () retourne la chaîne str et decode () `retourne la chaîne unicode si la méthode d'encodage est spécifiée correctement, que ce soit une chaîne str ou une chaîne unicode. Vous devriez penser qu'il reviendra.

en conclusion

Utilisons Python3.

Recommended Posts

Python2 str / unicode et encoder / décoder
Expérimenté avec unicode, décoder et encoder
str et unicode
l'expression régulière de python, str et unicode sont sobres et addictives
Mon str (Python)
Décodage / encodage Base64
str et repr
[python] Compresser et décompresser
Astuces Python et Numpy
[Python] pip et roue
Itérateur et générateur Python
Décoder ShiftJIS en Unicode
Paquets et modules Python
Intégration Vue-Cli et Python
Ruby, Python et carte
entrée et sortie python
Python et Ruby se séparent
Si vous rencontrez une "erreur de décodage Unicode" en Python
Python asyncio et ContextVar
Obtenez la page Web Python, encodez et affichez les caractères
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python: variables de classe et d'instance
3-3, chaîne Python et code de caractère
Série Python 2 et série 3 (édition Anaconda)
Python et matériel - Utilisation de RS232C avec Python -
Python sur Ruby et Ruby en colère sur Python
Indentation Python et format de chaîne
Installez Python et Flask (Windows 10)
À propos des objets et des classes Python
À propos des variables et des objets Python
Apache mod_auth_tkt et Python AuthTkt
Å (Ongustorome) et NFC @ Python
Apprenez à connaître les packages et les modules Python
# 2 [python3] Séparation et commentaire
Copie superficielle Python et copie profonde
Mémo tranche python et rubis
Installation de Python et grammaire de base
J'ai comparé Java et Python!
Copie superficielle Python et copie profonde
À propos de Python, len () et randint ()
À propos de la date et du fuseau horaire Python
Installez Python 3.7 et Django 3.0 (CentOS)
Construction d'environnement Python et TensorFlow
Syntaxe Ruby et Python ~ branch ~
[Python] Python et sécurité-① Qu'est-ce que Python?
Pile et file d'attente en Python
métaclasse python et déclaration sqlalchemy
Implémentation de Fibonacci et des nombres premiers (python)
bases de python: conditions et itérations
Opérateur de bits Python et somme logique
Module de débogage et de test Python
Liste Python et tapples et virgules
Variables Python et ID d'objet
Notation et générateur d'inclusion de liste Python
À propos de Python et des expressions régulières
python avec pyenv et venv
Unittest et CI en Python
Description et implémentation de Maxout (Python)
[python] Obtenir le quotient et le surplus