Shift_JIS なファイル名を含む Zip ファイルを解凍する unzip パッケージの作り方
ネタ元: Shift_JISなファイル名を含むZipファイルを解凍する
try: out.write(f.read(member)) finally: out.close()
1行でファイルを read して write しつつ、諸々は例外で引っ掛ければ良いでしょ、と言うコードがおもしろいです(^ ^;;
また、本文を読んでいると、unzip-ja なるパッケージがあるそうなので、探してみました。
Re: [opensuse-ja] Re: [opensuse-ja] unzipの 文字化け
ここで紹介されているパッチを適用して、CentOS 5.3 で unzip-ja なるパッケージを作ってみます。個人的な意見なのですが、パッケージ名を unzip-ja とするのはあまりよろしくありません。というのは、別パッケージ扱いになるので、ソースを完全に別管理にする意図も含めてしまいます(メンテナンスのことを考えた場合のお話ですが)。もしくは、コマンド名を unzip-ja に変更して、全く別コマンドとして扱いたいのであれば、パッケージ名を変更するのも理解できます。
しかしながら、紹介されているパッチがどのようなものか全く見ていませんが、本来は、オリジナルの動作に影響を与えない(互換性を確保した)パッチを作成して、unzip の別リリースバージョンとして提供するのが理想的です。そして、良いものであれば upstream にマージするように働きかければ良いと思います。
閑話休題。従って、正しくは CentOS 5.3 の unzip-ja でなく、unzip の ja リリースの作成方法です。
# lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch Distributor ID: CentOS Description: CentOS release 5.3 (Final) Release: 5.3 Codename: Final ソースとパッチをダウンロードします # wget http://mirror.centos.org/centos/5/os/SRPMS/unzip-5.52-3.el5.src.rpm # wget 'http://ebuild.gentoo.gr.jp/open.php?mode=download&type=files&cat=app-arch&app=unzip&arg=unzip-5.52-ubuntuja.patch&visible=' -O unzip-5.52-sjis.patch # ls unzip-5.52-3.el5.src.rpm unzip-5.52-sjis.patch ビルドするために、環境を整えます # rpm -ivh unzip-5.52-3.el5.src.rpm # cp -p unzip-5.52-sjis.patch /usr/src/redhat/SOURCES/ # cd /usr/src/redhat/SPECS/ # cp -p unzip.spec unzip.spec.orig # vi unzip.spec # diff -ur unzip.spec.orig unzip.spec --- unzip.spec.orig 2009-06-28 10:27:48.000000000 +0900 +++ unzip.spec 2009-06-28 10:32:00.000000000 +0900 @@ -1,7 +1,7 @@ Summary: A utility for unpacking zip files. Name: unzip Version: 5.52 -Release: 3%{?dist} +Release: 3%{?dist}.1ja License: BSD Group: Applications/Archiving Source: ftp://ftp.info-zip.org/pub/infozip/src/unzip552.tar.gz @@ -14,6 +14,7 @@ Patch9: unzip-5.52-long-filename.patch Patch10: unzip-5.52-open.patch Patch11: unzip-5.52-ret.patch +Patch12: unzip-5.52-sjis.patch URL: http://www.info-zip.org/pub/infozip/UnZip.html BuildRoot: %{_tmppath}/%{name}-%{version}-root @@ -39,6 +40,7 @@ %patch9 -p1 -b .lfn %patch10 -p1 -b .open %patch11 -p1 -b .ret +%patch12 -p1 -b .sjis ln -s unix/Makefile Makefile %build @@ -59,6 +61,9 @@ %{_mandir}/*/* # rpmbuild -ba unzip.spec # rpm -q unzip unzip-5.52-3.el5 # rpm -Uvh ../RPMS/i386/unzip-5.52-3.1ja.i386.rpm 準備中... ########################################### [100%] 1:unzip ########################################### [100%] # rpm -q unzip unzip-5.52-3.1ja
ここで作成した src.rpm は以下になります。
動作検証をしてみます。Windows7 RC で日本語のディレクトリに日本語のファイルを作成し、Windows の圧縮機能を使って Zip ファイルを作成します。それから、その Zip ファイルを unzip コマンドで解凍してみます。
Shift_JIS パッチの適用前。
# unzip SJISでエンコードされたアーカイブ.zip Archive: SJISでエンコードされたアーカイブ.zip extracting: SJIS�+�G���R�[�h�������f�B���N�g��/SJIS�+�G���R�[�h�������t�@�C���+.txt # ls -lR .: 合計 8 drwxr-xr-x 2 root root 4096 2009-06-28 11:38 SJIS?+?G???R?[?h???????f?B???N?g?? -rwxr--r-- 1 root root 240 2009-06-28 10:39 SJISでエンコードされたアーカイブ.zip ./SJIS?+?G???R?[?h???????f?B???N?g??: 合計 0 -rw-r--r-- 1 root root 0 2009-06-28 10:35 SJIS?+?G???R?[?h???????t?@?C???+.txt
Shift_JIS パッチ適用後。
# unzip SJISでエンコードされたアーカイブ.zip Archive: SJISでエンコードされたアーカイブ.zip extracting: SJISでエンコードされたディレクトリ/SJISでエンコードされたファイル名.txt # ls -lR .: 合計 8 -rwxr--r-- 1 root root 240 6月 28 11:40 SJISでエンコードされたアーカイブ.zip drwxr-xr-x 2 root root 4096 6月 28 11:40 SJISでエンコードされたディレクトリ ./SJISでエンコードされたディレクトリ: 合計 0 -rw-r--r-- 1 root root 0 6月 28 10:35 SJISでエンコードされたファイル名.txt