YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

nkfやiconvがなくても文字変換できるよ

はじめに

こんにちは、Python界の情弱です。明日(日付的には今日)iPhone 4S買うからちょっと浮かれてます。某Skypeチャットで「Unicodeが\uXX\uYYみたいなまま保存されたテキストファイルの処理ができない!」っていう話題があって、ちょうど前に調べたので回答したら意外と反響あったのでここにもメモっておきます。

Unicode文字列しかないファイルをdecodeするとき

たとえばこんなファイルだった場合。

  • hoge.txt
\u3068\u3093\u3077\u30fc

こうすればいいです。

fp = open('hoge.txt','rb')
data = fp.read()
print data.decode('unicode-escape')

これでできた。

$ python convert.py
とんぷー

ちなみに対応しているエンコーディング一覧はここ。思いつくのはたぶん大抵載ってる。

というか

タイトルの話なんですが、そのままです。「Pythonでのマルチバイト文字の扱いがわからない」って声を聞く度に心を痛めるのですが、Pythonはかなりマルチバイト文字の処理に関しては優秀だと思います。nkfやiconvより便利だったりすることもあります。

(外)エンコーディングされた文字列 <---> (内)PythonでのUnicode

なんでもいいんですけど、たとえばPython 2.xだとしたら

  • 外からもらってくるデータは内部処理するときはdecodeしてUnicodeにしてから使う
  • 内部でUnicodeとして持ってた文字列は外部にはencodeして渡す
  • unicodeとstrは直接連結しない

ってやってればまず間違えません。