YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

マルチバイト文字列のエンコード・デコード

動機

自分が書いたコードがマルチバイトに全然対応してなかった。ショック。というわけでunicodeで受け渡しするようにしました。

方法

今回はPython2.5での話をしています。encode()、decode()メソッドを使えばOK。
そもそもPythonの文字列型ってなによって話なんですが、str型とunicode型の二種類があります。基本マルチバイトを扱ってるときはunicode中心に考えれば上記使い方に納得です。
まずそもそもunicode型扱ってて最初に意味不明になったのは、「結局unicode型って文字コードはなんなの?」ってことなんですが、結論から言うと「どの文字コードでもない」、つまりPython独自のもの。というわけで外部とのやりとりが発生するときは必ず変換が必要。

unicodeから各種文字コードに変換する
ustr = u'こんにちは'
print type(ustr) # <type 'unicode'>
ustr.encode('utf-8')

例だとunicode型をUTF-8に変換してます。ここもはまりポイントで、UTF-8はあくまでUnicodeの実装であって、unicode型とは違いますよということ。これで15分くらい悩んだ。

各種文字コードからunicodeに変換する
# strにUTF-8の文字列が入っているとします
print type(str) # <type 'str'>
str.decode('utf-8')
unicode(str, 'utf-8') # unicode関数を使ってもOK
Windowsとか

WindowsだとShift_JISがmbcsという文字コードになってるみたいです。

メモ

マルチバイト文字列を扱う関数を実装するときはどんな文字列を扱ってるか気をつけないといけないですね。