Pythonの文字列

pythonの文字列にはuicode文字列とstr文字列がある。簡単に違いを示すと、
unicode文字列:文字列
・str文字列:バイト文字列

len()を使用すれば、そのことがよくわかる。

>>> len('もじれつ')
12
>>> len(u'もじれつ')
4

※u"ex"はunicode文字列への変換を表す。


unicode文字列も、str文字列もbasestringを継承している。

>> isinstance('あいうえお', basestring)
True
>>> isinstance(u'あいうえお', basestring)
True
>>> isinstance('あいうえお', unicode)
False
>>> isinstance(u'あいうえお', unicode)
True
>>> isinstance('あいうえお', str)
True
>>> isinstance(u'あいうえお', str)
False


unicode文字列とstr文字列間で二項演算などを行うと、自動的にunicode文字列に変換される。

>>> u'aaa' == 'aaa'
True


ただし、非ASCII文字を含むstr型をunicodeに変換しようとすると、エラーになる。

>>> u'aa' + 'あいうえお'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
>>>
>>> u'aa' + u'あいうえお'
u'aa\u3042\u3044\u3046\u3048\u304a'

str文字列とunicode文字列は混ぜるな注意ということ。
基本的には、unicode文字列に変換しておくとハマりづらくなるのかな。


□str文字列とunicode文字列の変換

>>> #utf-8のunicode文字列を、utf-8のstr文字列に変換する
>>> unicode = u'ああああああ'
>>> len(unicode)
6
>>> len(unicode.encode('utf-8'))
18
>>> 
>>> #utf-8のstr文字列を、utf-8のunicode文字列に変換する。
... str = 'ああああああ'
>>> len(str)
18
>>> len(str.decode('utf-8'))
6

参考
http://d.hatena.ne.jp/nyagao/20070808/1186581885
http://blog.livedoor.jp/dankogai/archives/50696661.html

エキスパートPythonプログラミング

エキスパートPythonプログラミング