[PYTHON] str et unicode

C'est une série Python ** 2.x **.

Le code est essayé sur la console de python en exécutant la commande python '' à partir de l'invite de commande sur Terminal sur Mac et sur Windows. `` Python 2.7.9 '' `.

Qu'est-ce que str?

str est une chaîne de caractères dite multi-octets. 'Chaîne'Ecrire comme.




#### **`len(Chaîne)Ensuite, le nombre d'octets sera retourné. coding: utf-9 pour 8.`**
>>> len('Iroha')

9

for -Si vous le mettez avec in, il sera traité octet par octet..



for c in 'abc': ... print c

a b c


for c in 'Iroha': ... print c

� � � � � � � � �



#### **`unicode.encode()Peut convertir unicode en str avec.`**
>>> u'abc'.encode()

'abc'

Il existe un concept d'encodage.

>>> u'Iroha'.encode('utf-8')

'\xe3\x81\x84\xe3\x82\x8d\xe3\x81\xaf'
>>> u'Iroha'.encode('cp932')

'\x82\xa2\x82\xeb\x82\xcd'

Cela dépend de l'encodage de l'environnement d'exécution. Utf-8. Lorsqu'il est exécuté sur le terminal de Mac.

>>> 'Iroha'

'\xe3\x81\x84\xe3\x82\x8d\xe3\x81\xaf'

Lorsqu'il est exécuté à partir de l'invite de commande de Windows7, cp932```.

>>> 'Iroha'

'\x82\xa2\x82\xeb\x82\xcd'

`str``` écrit directement dans le fichier de script suit l'encodage du fichier. Cependant, s'il ne correspond pas à `` # coding: (encoding name) '', une erreur d'exécution se produira.

#!/usr/bin/env python
# coding: utf-8

print 'Iroha'

↑ est imprimé avec utf-8, mais si l'encodage de l'environnement CUI est différent, les caractères seront déformés.

Qu'est-ce que l'Unicode?

unicode traite les chaînes en unités de caractères, pas en octets. u'Chaîne'Préfixe u comme.




#### **`len(Chaîne)Puis**nombre de mots**Sera retourné.`**
>>> len(u'Iroha')

3

for -Si vous le mettez avec in, il sera traité caractère par caractère..



for c in u'abc': ... print c

a b c


for c in u'Iroha': ... print c

je Ro Est



#### **`str.decode()Peut convertir de str en unicode avec.`**
>>> 'Iroha'.decode('utf-8')

u'\u3044\u308d\u306f'

L'encodage d'Unicode est unifié et les développeurs n'ont pas besoin d'être conscients de l'encodage lors de l'utilisation d'Unicode..



u'Irohani' + u'Hoheto'

u'\u3044\u308d\u306f\u306b\u307b\u3078\u3068'


 Cependant, lors de la sortie vers l'extérieur du script, il sera toujours converti en `` `` str```.

print u'Iroha'.encode('utf-8')

Iroha



#### **`Si vous ne convertissez pas unicode en str, le runtime de python le convertira automatiquement, mais l'encodage utilisé pour la conversion dépend de l'environnement d'exécution..`**

Un cas courant est lorsque vous essayez de convertir un japonais mixte `str``` avec coding: ascii et que vous obtenez une exception` `ʻUnicodeEncodeError ...

>>> print u'Iroha'

Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

Le fonctionnement sans conversion dépend de l'environnement d'exécution. Lorsque vous le sortez du script, vous devez en être conscient et le convertir en unicode-> `` `str```.

Utilisation correcte d'Unicode et de str

À l'intérieur du script, je pense qu'il est préférable de l'unifier en unicode.

sys.Str obtenu à partir de la bibliothèque, comme args, est immédiatement converti en unicode.


 Au contraire, lors de l'impression d'une chaîne de caractères en dehors du script (exemple: `` `print```), elle est convertie en` `ʻunicode```->` `` str``` juste avant l'impression.


#### **`Si vous utilisez un mélange de str et d'unicode, le runtime python essaiera de convertir str en unicode.`**

A ce moment, UnicodeDecodeError se produit et c'est souvent ennuyeux.

>>> 'Irohani' + u'Hoheto'

Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

Lorsque vous ne connaissez pas l'encodage de str ...

Lorsque vous ne connaissez pas l'encodage de strobtenu de l'extérieur du script Je convertis enunicode``` avec le code suivant.

def toUnicode(encodedStr):
    '''
    :return: an unicode-str.
    '''
    if isinstance(encodedStr, unicode):
        return encodedStr
    
    for charset in [u'cp932', u'utf-8', u'euc-jp', u'shift-jis', u'iso2022-jp']:
        try:
            return encodedStr.decode(charset)
        except:
            pass

Recommended Posts

str et unicode
str et repr
Python2 str / unicode et encoder / décoder
EP 3 Connaître les différences entre octets, str et unicode
str (utf-8) ou unicode est important
Expérimenté avec unicode, décoder et encoder
l'expression régulière de python, str et unicode sont sobres et addictives
À propos de _ et __