Python3でcp932なzipファイルを作りたい
前提
Python3ではutf-8なZipファイルしか作れません
Python(2, 3)でutf-8なZipファイルを作ると、自動的にzipファイルのutf-8フラグがOnになります
Python2は2008年に対応 GitHub Hg
やりたいこと
仕事の都合で、どうしてもcp932な、他の文字エンコーディングを考慮しない古い方式の、zipファイルを作りたい
やったこと
Windows向けにファイル名をShift-JISでZIP圧縮する(with zipfile) - Qiita を参考にPython3でパッチをあてる
モンキーパッチをmockで切り替えられるように書いてみた
code:zipcp932patch.py
"""
Py3でcp932エンコードされたzipファイルを作成するパッチ
https://scrapbox.io/shimizukawa/Python3でcp932なzipファイルを作りたい
利用コード例::
>> from zipfile import ZipFile
>> from zipcp932patch import zipcp932patch
>> with zipcp932patch, ZipFile('output.zip', 'w') as zf:
... zf.write('日本語.txt')
...
"""
import unittest.mock
def _patch_encodeFilenameFlags(self):
try:
return self.filename.encode('ascii'), self.flag_bits
except UnicodeEncodeError:
return self.filename.encode('cp932'), self.flag_bits
zipcp932patch = unittest.mock.patch(
'zipfile.ZipInfo._encodeFilenameFlags',
_patch_encodeFilenameFlags)
参考
Python 3 で日本語ファイル名が入った zip ファイルを扱う - Qiita by @methane
Windows向けにファイル名をShift-JISでZIP圧縮する(with zipfile) - Qiita
Windowsのエクスプローラーを使ってのzip解凍はShift-JIS(cp932)で解釈するため、zipfileモジュールを使った圧縮(UTF-8)だと、文字化けが発生する。
shimizukawa.iconあれ、エクスプローラーそうだっけ?
Win8以降なら大丈夫そう? zipファイルのutf-8フラグ#5da5325a1911970000861c4c
zipfileモジュールを直接いじる必要がある。
shimizukawa.iconまじかー