zipの仕様をあたったわけではないけど、どうもアーカイブ内のファイル名の文字コードは環境依存らしい。
なので、日本語版のWindowsで作成したzip内のファイル名はCP932だし、Macで作成したものはutf8-macらしい。
この、Windowsで作成したCP932ファイル名のzipファイルを、MacのFinderで右クリックして開く(デフォルトで、アーカイブユーティリティ.appに関連付けられている)と、勝手にCP932をutf8-macに変換してくれるので、意識せずにそのままFinderでアクセスできる。
しかし、この展開してできたディレクトリにちょっと手を加えて、Finderの「"ディレクトリ名"を圧縮」を使うと、utf8-macでファイル名がエンコードされてしまい、さらには __MACOSX とか言う謎のディレクトリまで入ってしまう。(これについてはぐぐれば情報がいっぱいある)
これではWindowsでは使えないので、日本語を含まないファイル名にしてコマンドラインのzipで固めてやると、__MACOSXも入らない。
ここで、「ちょっと手を加えたい」zipファイルがたくさんある場合、当然シェルスクリプトとかで処理したいわけだけど、コマンドラインのunzipはアーカイブユーティリティみたいに文字コードを変換してくれないのでCP932のアーカイブを文字化けせずに展開できない。
ちょっと調べてみると、日本語ファイル名が文字化けしないunzipのビルド手順 - ymknの日記と言うページを見つけたので、真似してみる。
ただし、私はHomebrewではなくMacPortsなので、その路線で。(と言っても、自家Portを作ったりするわけではない)

前提条件
  • MacPortsがインストールされている。
  • MacPortsでlibiconvがインストールされている
手順
  1. sudo port fetch unzip でunzipのソースを取得。
  2. 好きなところにソース(/opt/local/var/macports/distfiles/unzip/unzip60.tar.gz)を展開。
  3. FS#15256 – [unzip] New unzip 6.0 lacks -O -I optionsからpatchを持ってきて、patch -p1であてる。
  4. unix/Makefileをコピーして、以下を修正
    *** unix/Makefile       2009-01-19 07:41:18.000000000 +0900
    --- Makefile    2011-05-03 00:14:43.000000000 +0900
    ***************
    *** 50,56 ****
      CFLAGS = -O
      CF_NOOPT = -I. -I$(IZ_BZIP2) -DUNIX $(LOC)
      CF = $(CFLAGS) $(CF_NOOPT)
    ! LFLAGS1 =
      LF = -o unzip$E $(LFLAGS1)
      LF2 = -s
      
    --- 50,56 ----
      CFLAGS = -O
      CF_NOOPT = -I. -I$(IZ_BZIP2) -DUNIX $(LOC)
      CF = $(CFLAGS) $(CF_NOOPT)
    ! LFLAGS1 = -L/opt/local/lib -liconv
      LF = -o unzip$E $(LFLAGS1)
      LF2 = -s
      
    ***************
    *** 121,127 ****
      INSTALL_D = mkdir -p
      # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
      manext = 1
    ! prefix = /usr/local
      BINDIR = $(prefix)/bin#                       where to install executables
      MANDIR = $(prefix)/man/man$(manext)#  where to install man pages
      INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \
    --- 121,127 ----
      INSTALL_D = mkdir -p
      # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
      manext = 1
    ! prefix = /opt/local
      BINDIR = $(prefix)/bin#                       where to install executables
      MANDIR = $(prefix)/man/man$(manext)#  where to install man pages
      INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \
    ***************
    *** 872,878 ****
      
      # Macintosh MacOS X (Unix-compatible enviroment), using standard compiler
      macosx:       unix_make
    !       $(MAKE) unzips CFLAGS="-O3 -Wall -DBSD" LF2=""
            $(STRIP) $(UNZIPS)
      
      # Macintosh MacOS X (Unix-compatible enviroment), using gcc
    --- 872,878 ----
      
      # Macintosh MacOS X (Unix-compatible enviroment), using standard compiler
      macosx:       unix_make
    !       $(MAKE) unzips CFLAGS="-O3 -Wall -DBSD -I/opt/local/include -DNATIVE" LF2=""
            $(STRIP) $(UNZIPS)
      
      # Macintosh MacOS X (Unix-compatible enviroment), using gcc
    
  5. 後は、make macosxして、make installすれば/opt/local/bin に入る。
これで、unzip -O cp932 -l hoge.zip のように-O cp932をつけると、cp932のzipファイルが扱える。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: zipアーカイブ内のファイル名

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/2619

コメントする

このブログ記事について

このページは、falseが2011年5月 2日 23:51に書いたブログ記事です。

ひとつ前のブログ記事は「vimperatorの設定」です。

次のブログ記事は「macportsのPortfileを書く」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1