python2 unicode str


unicode
unicodeは符号化スキームであり、utf-8はunicodeの実装形態である.
Python 2コード
In [1]: a = '   '
In [2]: a
Out[2]: '\xe5\x95\x8a\xe5\x93\x88\xe5\x93\x88'
In [4]: type(a)
Out[4]: str
In [5]: len(a)
Out[5]: 9
In [6]: b = u'   '
In [7]: type(b)
Out[7]: unicode
In [8]: len(b)
Out[8]: 3
In [9]: a.decode('utf-8')
Out[9]: u'\u554a\u54c8\u54c8'
In [10]: b
Out[10]: u'\u59da\u8d6b\u8d6b'

In [11]: b.encode('utf-8')
Out[11]: '\xe5\xa7\x9a\xe8\xb5\xab\xe8\xb5\xab'

In [12]: c = '   '

In [13]: c
Out[13]: '\xe5\xa7\x9a\xe8\xb5\xab\xe8\xb5\xab'

In [14]: import sys

In [15]: sys.getdefaultencoding()
Out[15]: 'ascii'

In [16]: b + c
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
16-c6b7c7e5694f> in ()
----> 1 b + c

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

In [17]: import sys

In [18]: relaod(sys)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in ()
----> 1 relaod(sys)

NameError: name 'relaod' is not defined

In [19]: reload(sys)
sys' (built-in)>

In [20]: sys.setdefaultencoding('utf-8')

In [21]: b + c
Out[21]: u'\u59da\u8d6b\u8d6b\u59da\u8d6b\u8d6b'

In [22]: type(b + c)
Out[22]: unicode

python 2ではa=' ',aのタイプはstrであり、符号化されたバイトシーケンスである.aの長さはバイト数である.bのタイプはunicode(テキスト文字列を格納する)であり、bの長さは文字数である.
そうごへんかん
str->decode(‘utf-8’)->unicode unicode->encode(‘utf-8’)->strがファイルに書き込まれたときにstrタイプのものは直接書き込むことができ、unicodeタイプの必須encodeの後に書き込むことができます.