ZIP 書庫ファイルに格納されたファイルの名前の文字化け

症状

ZIP 書庫ファイル(*.zip)を解凍(展開)すると、ファイル名が意味不明なものになる(文字化けする)ファイルが作成されます。この症状は、元々ファイル名に日本語など、英語以外の文字が含まれる場合によく発生します。以下に、より具体的な事例を示します。

  • OS X(Mac OS X)の Finder を使用し(1 つまたは複数のファイルを選択し、メニューバーで「ファイル」→「(ファイルの名前またはファイルの個数)を圧縮」を選択します)、名前に日本語の文字などを含むファイルを格納した ZIP 書庫ファイル(*.zip)を作成し、その ZIP 書庫ファイルを Windows 7 の Windows エクスプローラーを使用し(ZIP 書庫ファイルを右クリックし、「すべて展開」を選択します)て解凍(展開)すると、解凍されたファイルの名前で、日本語の文字などが文字化けします。まれに、途中で解凍処理が終了する(一部のファイルを解凍できない)こともあります[註 1]
  • Web ブラウザーを通した WebDAV の利用について。以前は、Web ブラウザーを通して WebDAV(Macintosh 環境Windows 環境)を使用して一度に複数のファイルをダウンロードするよう指定した場合にダウンロードされるファイルも、上記のように OS X で作成された ZIP 書庫ファイルと同様の仕様(以下で詳細をご説明しますが、General purpose bit は 0、ファイル名の文字符号化形式は UTF-8 でした)と考えられ、同様の症状が発生していました。しかし、2015 年 2 月現在、ファイル名の文字符号化形式は Shift_JIS(日本語以外の場合は不明)に変更され、Windows でも正しく解凍(展開)できるようになりました。

原因

OS X と Windows とで、ZIP 書庫ファイルの内部でファイル名部分に使用される文字符号化形式(エンコーディング)が異なるからです。

ZIP 書庫ファイルのファイル名部分で使用される文字符号化形式は、OS X では「UTF-8-MAC」(「UTF-8-MAC」は正式な文字符号化形式ではありませんが、ほぼ NFD を形式として Unicode 正規化が施された UTF-8 を意味します)、Windows では Windows-31J(Microsoft コードページ 932。Shift_JIS に対して、丸数字など若干の文字の追加が施されています)(現在(2015 年 2 月現在)の Windows(正確には、Windows NT(系))はファイル名の処理を原則として Unicode で行っていますが、互換性のために古い Windows-31J で処理する場面があります)になります。

簡単な対処法

一つの対処法は、ZIP 書庫ファイルに格納するファイルの名前は英文字のみにする、というものです。この方法では、特殊なソフトウェアは不要です。

もう一つの対処法は、Windows では ZIP 書庫ファイルの解凍を、ファイル名の文字符号化形式の自動判定機能が付いているソフトウェア(例 7-zip Portable(Windows のレジストリーを使用しませんので、教育用計算機システム(ECCS)でもご利用になれます)を使用して行う、というものです。この方法では、ファイル名に日本語の文字などが含まれていても正しく解凍できます。

技術的な解説(難しい)

ZIP 書庫ファイル形式の仕様書「ZIP File Format Specification」の付録 D(APPENDIX D – Language Encoding (EFS))によると、ZIP 書庫ファイルは元々、ファイル名の文字符号化形式は IBM コードページ 437 にしか対応していませんでした。IBM コードページ 437 は基本的なラテン文字しか含まないものであり、日本語の文字など他の種類の文字もファイル名として対応しようとするのなら、独自仕様にならざるを得ませんでした(幸いにも、OS X の「UTF-8-MAC」や Windows の Windows-31J の(ごく基本的な)英文字は IBM コードページ 437 のそれと共通なので、ファイル名に英文字しか含まれていない場合には文字化けしないのです)。

2007 年 9 月に登場した ZIP 書庫ファイル形式バージョン 6.3.2 で、ファイル名の文字符号化形式として UTF-8 への対応が行われました。これにより、日本語など様々な言語の文字が、ZIP 書庫ファイルでも正式に取り扱えるようになりました。ただし、この方法を使用するには、ZIP 書庫ファイルのある領域にある値を代入する必要があります。ZIP 書庫ファイルにおいて、Local file header や Central directory header(Central directory 中の File header)には、General purpose bit flag という 2 バイト(16 ビット)長の領域が存在します。この、General purpose bit flag のビット 11(2 の 11 乗(=2,048)の位)でファイル名やそれに付随する注釈の文字符号化形式を指定でき、値 0 は従来の IBM コードページ 437、値 1 は UTF-8 を使用することを意味します。そこで、本来ならば、ファイル名の文字符号化形式を UTF-8 とするならば、General purpose bit 11 に 1 を代入するのが筋ですが、OS X も Windows もこのビットに 1 を代入しない(0 になっている)ようです(結局どちらにしても独自仕様か?)。

しかし、アーカイバーはしばしばファイル名の文字符号化形式の自動認識機能を搭載しており、この機能を使用する限りは、ファイル名の文字符号化形式の問題が表面化することはほとんどありません。OS X 標準搭載のアーカイバー「アーカイブユーティリティ」にもこの機能がありますので、Windows で作成された ZIP 書庫ファイルであっても、解凍時にファイル名が文字化けすることは基本的にありません。Windows でも、標準搭載のものではなく、7-zipなどのサードパーティー製のアーカイバーを使用することで、OS X で作成された ZIP 書庫ファイルであっても、解凍時にファイル名が文字化けすることは基本的にありません。

後註

  1. Windows 7/Windows Server 2008 R2 向けには、文字化けなしに ZIP 書庫ファイルの解凍(展開)を可能とするための修正プログラムが配布されています。しかし、この修正プログラムは、2015 年 2 月現在では教育用計算機システム(ECCS)に導入されておりません。また、この修正プログラムを教育用計算機システム(ECCS)に個人で導入することはできません