pythonで日本語

webスクレイピングとかでどこからか日本語の文字列をもってくるといつもはまるので、自分用に
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html
のメモ

・文字列の表現に用いられるのは
- str型
- unicode
の二つ

・str型は、エンコード宣言で宣言した文字コードの文字列が格納される
 → ソースコード文字コードエンコード宣言が一致していれば変数への入出力は問題なく行える

unicode型はエンコード宣言に関わらず「Unicode文字列を表現可能な、とある内部形式」で情報を格納
 → str型の多バイト文字列の場合、len()や正規表現はバイト単位で行われるため変な感じになることがあるけど、unicode型なら文字単位で行われるためいい感じになる
 → 「とある内部形式」なので出力時にどの文字コードで出力するか決めなきゃダメ

… unicode型 ↔ str型
unicode型 → str型

u1.encode('utf-8') # ← unicode型からUTF-8のstr型へ

unicode型 ← str型

s1.decode('utf-8') # ← str型をUTF-8の文字列として解釈してunicode型へ
unicode(s1, 'utf-8') # 上とほぼ同じ

str型とunicode型の比較とか結合とかしようとすると、s1.decode('ascii')として両方をunicode型にして比較や結合をしようとする → s1がASCIIじゃないとUnicodeDecodeError

 → 文字列はできるだけunicode型で保持すること!