Les chaînes Python2 sont déroutantes.
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 |
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.
\ x
>>> 'Ah'
'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
[]
renvoie des octets au lieu de caractères>>> '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 ()
renvoie le nombre d'octets>>> len('Ah')
9
>>> 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 ()
renvoie le nombre de caractères>>> len(u'Ah')
3
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.
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
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.
decode ()
sur une chaîne str donne une chaîne unicodeCe 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)
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.
Utilisons Python3.
Recommended Posts