なにをするのか
python3でzipfileを使って日本語名のファイルをフォルダ事圧縮した場合、Windowsのエクスプローラーで解凍するとzipされたファイルが文字化けしてしまう。
原因
Windowsのエクスプローラーを使ってのzip解凍はShift-JIS(cp932)で解釈するため、zipfileモジュールを使った圧縮(UTF-8)だと、文字化けが発生する。つまりzipする際のファイル名のエンコードをShift-JISに指定すればOK。ただ、そんなオプションはなかったのでzipfileモジュールを直接いじる必要がある。
ちなみにLhaplusなどのちょっと賢い圧縮解凍ソフトならUTF-8でもちゃんと理解できるんだけどね。
あくまでその場しのぎの方法です、自己責任でご利用ください
環境
Python 3.6.3
やり方
①まずソースコードをコピー
②以下修正を加える
# 430行目あたり~
def _encodeFilenameFlags(self):
try:
return self.filename.encode('ascii'), self.flag_bits
except UnicodeEncodeError:
#return self.filename.encode('utf-8'), self.flag_bits | 0x800 #この行をコメントアウト
return self.filename.encode('cp932'), self.flag_bits #Shift-JIS(cp932)を指定する。
③実行プロジェクトと同一のフォルダに設置して後は呼び出すだけ。
※注意事項※ モジュール呼び出し順序について
今回標準モジュールを作りなおしてるのだが、もともとのzipfileはPYTHONPATHに含まれる。
sys.pathでpathを通しても先に標準モジュールが呼び出される。
そのため同一フォルダに設置するなど、優先順位をあげるか別名で保存する必要がある。
参考までにファイルの検索順は以下の通りとなっている。
- 実行中のファイルと同じフォルダ
- カレントフォルダ
- 環境変数「PYTHONPATH」に列挙したフォルダ
- sys.pathに登録してあるフォルダ
参考
moduleのimportの仕組み
http://python.matrix.jp/pages/tips/import.html#id3