ZIP中のファイル名の文字化け

こんな記事がありました。

gihyo.jp

これはMacユーザー用の書籍の宣伝記事らしいのですが、「Windowsを使ってる人のためにMac側がひと手間かけてあげよう」なんて殊勝なことをマカーが言うとは時代も変わったもんです。([追記] はてブのコメントを見たらさすがマカーという意見が並んでて安心しました)

まあ私はWindowsユーザーでもMacユーザーでもないのでどうでもいいのですが、文字化けなネタなので食いついてみます。

記事中に、「付物出稿.zip」というファイルを開いた時の画像が載ってます。

文字の並びからして、UTF-8文字列をシフトJIS(CP932)とみなして表示してしまった文字列でしょう(「繧ォ繝上y繝シ繝輔か繝ォ繧ソ繧・」の元の文字は「カバーフォルダ」で、「蟶ッ繝輔か繝ォ繧ソ繧・」は「帯フォルダ」)。

つまり、Macはファイル名をUTF-8でZIPに書き込み、WindowsはそれをシフトJIS(CP932)と思って開いているということです。

ZIPフォーマット中のファイル名は文字コード情報を持っていません。なので、MacとWindowsのようにファイル名の文字コードが異なるシステム同士でZIPをやりとりすると、このように文字化けしてしまうのです。

手元にMacが無いので確かめてはいないのですが、どうやらWindowsで作ったZIPファイルをMacで開く分には問題ないらしいです。 Macのファイル名の文字コードは昔はシフトJISだったようなので、互換性を考慮してUTF-8で文字化けする場合はシフトJISとみなして開いてくれるのかもしれません。

2007年にZIPフォーマットは拡張されてファイル名がUTF-8であることを示すフラグが追加されました。 ということは、現代においてはZIP作成時にファイル名の文字コードをUTF-8にしてこのフラグを立てれば文字化けはしないはずなのです。

実はWindowsはZIPを作成するときにはCP932でファイル名を書くのですが、ZIPを開くときにはちゃんとこのフラグを見てくれます(Windows 8 あたりから)。 なのにMacで作られたZIPのUTF-8のファイル名が文字化けするということは、MacのZIPはこのフラグを立ててないということなのでしょう。

WindowsがZIP作成時にUTF-8にしないのはおそらく過去の互換性を重視しているからでしょう。 MacはせっかくUTF-8なんだからフラグを立ててくれればいいんですけどね。惜しい。

まあ、それぞれ自分のロケールに従った文字コードでZIPを書いてるという点ではお互い様です。

ちなみにUbuntuはZIP作成時にちゃんとUTF-8フラグを立ててUTF-8で作ります。なのでWindowsでも問題なく開けますし、Macはこのフラグを見てるかどうかは知りませんが、文字コードがUTF-8だからおそらく問題なく開けるでしょう。

UbuntuでのZIP展開時には、UTF-8フラグが立っていたらそのままUTF-8のファイル名として扱い、フラグが立っていない場合は、現在のロケール(LC_ALL, LANG環境変数等)を見て文字コード変換を行います。 jaロケールの場合はCP932からUTF-8への変換を行います。

ですので、UbuntuとWindowsの間では問題になることはないでしょう。

ということでMacをやめてUbuntu使えば解決ですね!