Pythonの日本語というかunicodeではまった話

Python(2.x)で日本語を含む文字列を+演算子を使って連結をしようとすると、

Traceback (most recent call last):
  File "", line 1, in 
    str = a + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position X: ordinal not in range(128)

とか言われて連結できない件。

Python(2.x)の文字列にはstr型とunicode型がある、というのをついさっきまで理解できていませんでした…
Pythonで日本語文字列 (UnicodeとUTF-8, Shift-JIS, EUC-JPなどの相互変換) - プログラミング工場 / Python
とか
マルチバイト文字列のエンコード・デコード - YAMAGUCHI::weblog
とか
Pythonでの日本語処理:Unicode型と文字列型 - 思い立ったら書く日記
をみて、ようやく何となく理解。

  • 文字列を連結する際に、暗黙的にunicode型に変換される
  • 暗黙的な変換では元の文字列の文字コードが考慮されない(指定されない)のでデフォルトのasciiに基づいて変換しようとする
  • その結果、7bit=128の範囲じゃない値(要するに8bitの値)が使われてるからasciiコーデックがデコードできない!

といってるってことね。
str = '日本語'.decode('utf-8') + '日本語'.decode('utf-8')
とかすればよさそう、ということで。

なかなかむつかしい。