Python zipファイルの解凍時やurllib.unquote()の日本語が文字化けする問題周辺のまとめ
Windowsで圧縮したzipファイルをUbuntuで解凍するとファイル名や子ディレクトリ名に文字化けが発生することがあります。
解決方法はたくさんあるようですが、いまいち理解できないものもありました。
ほとんどの問題は、Windowsのcp932コードを変換する際に起きている模様です。
sudo権限も必要なくて一番簡単にできた(※理解できたとは言っていない)ものをメモしておきます。
こちらのサイトのPythonコードをzipfile_altとしてzipファイルのあるディレクトリに保存して下さい。
その後、同一ディレクトリで次のコードを実行すればよいです。
import zipfile_alt as zipfile def unzip(filename, path='.', pwd=''): with zipfile.ZipFile(filename, 'r') as zip_file: try: zip_file.extractall(path=path, pwd=pwd) print 'OK' except: print 'NG' if __name__ == "__main__": unzip_with_pwd(filename="test.zip", pwd="test")
urllibのほうはもっと分かりやすいです。
#coding:utf-8 import urllib str1=urllib.quote("あいうえお") print "str1:"+str1 str2=urllib.unquote(str1) print "str2:"+str2 str3=urllib.quote(u"あいうえお".encode('cp932')) print "str3:"+str3 str4=urllib.unquote(str3) print "str4:"+str4 str5=urllib.unquote(
このときの出力は、
str1:%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A str2:あいうえお str3:%82%A0%82%A2%82%A4%82%A6%82%A8 str4:����������
要は、unquote()関数は、utf-8を元にしたURL文字列ならばutf-8に戻してくれますが、cp932を元にしていると、cp932に戻すために文字化けが生じます。
htmlパースしているときに起こって、気づかぬまま詰まってしまったことがありました。
こういうときは当然ながら、
print "str4:"+str4.decode('cp932').encode('utf-8')
とするだけです。