読者です 読者をやめる 読者になる 読者になる

orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Pythonでの普通の文字列とUnicode文字列の違い

Pythonで日本語を使おうとすると、エンコードの指定や''とu''の違いなどでよくわからなくなるので文字列型についての解説です。(よくわからなくなるのは自分だけと言う説もあります)なお環境はPython2.5ですが2.3以上なら変わらないと思われます。

まず、Pythonには文字列型としてstrとunicodeがあります。strは文字列をbyteの配列で表す昔ながらの型です。一般的にアルファベット1文字を1バイト、日本語1文字を2バイト以上で表します。これに対し、unicodeは文字列を文字の配列で表す型です。文字列の単位はあくまで"文字"であり、アルファベットでも日本語でも同じ1文字です。このため、1文字が何バイトであるかを意識する必要はありません。

ソースコードでは

#coding:utf-8

s = 'Hello どうも'  # str
u = u'Hello どうも' # unicode

というように書き分けます。

さて、このコードが実行されるとsとuには何が代入されるのでしょうか?

もちろん「Hello どうも」という文字列なのですが、ここでは具体的に内部ではどうなっているかを考えましょう。以下のように文字列に対して、forで回すことによって中身を見てみます。

[ord(c) for c in string] # 数値表現
[c for in string]        # 文字表現

このコードをsとuに対して実行すると次のような結果になります。

s = 'Hello どうも'のとき


















































数値表現 72 101 108 108 111 32 227 129 169 227 129 134 227 130 130
文字表現 'H' 'e' 'l' 'l' 'o' ' ' '\xe3' '\x81' '\xa9' '\xe3' '\x81' '\x86' '\xe3' '\x82' '\x82'
日本語表現 H e l l o  

u = u'Hello どうも'のとき






































数値表現 72 101 108 108 111 32 12393 12358 12418
文字表現 u'H' u'e' u'l' u'l' u'o' u' ' u'\u3069' u'\u3046' u'\u3082'
日本語表現 H e l l o  

どうでしょうか?sにはUTF-8(ソースファイルの文字コード)での文字列表現が、uにはUnicodeに変換された文字列が代入されていることがわかると思います。

今度はソースファイルの文字コードShift_JISに変えてみます。

#coding:sjis

s = 'Hello どうも'  # str
u = u'Hello どうも' # unicode

s = 'Hello どうも'のとき












































数値表現 72 101 108 108 111 32 130 199 130 164 130 224
文字表現 'H' 'e' 'l' 'l' 'o' ' ' '\x82' '\xc7' '\x82' '\xa4' '\x82' '\xe0'
日本語表現 H e l l o  

u = u'Hello どうも'のとき






































数値表現 72 101 108 108 111 32 12393 12358 12418
文字表現 u'H' u'e' u'l' u'l' u'o' u' ' u'\u3069' u'\u3046' u'\u3082'
日本語表現 H e l l o  

今度はsのほうが、Shift_JISでの表現になっていることがわかります。一方uはUnicodeに変換されているので、UTF-8のときと変わりません。


以上のことをまとめると、

となります。