ZIP のファイル名が文字化けする原因と直し方 - Shift_JIS と UTF-8
結論: 化けるのはファイル名の文字コードが食い違うから
ZIP を開いた時に日本語のファイル名だけが「Ä╩É^âè」や「蜀咏悄繝ェ」のような字の列になるのは、作った側と開いた側で、ファイル名の文字コードの解釈が食い違っているためです。中身のデータは壊れていないので、正しい文字コードで読み直せば元の名前に戻ります。
ZIP の仕様書 APPNOTE.TXT (PKWARE、6.3.10、2022 年 11 月改訂) では、各ファイルのヘッダーにある汎用フラグ (general purpose bit flag) で名前の文字コードを示せるのは bit 11 だけです。汎用フラグの bit 11 (Language encoding flag、略して EFS) が立っていれば、名前は UTF-8 で書かれていなければならない、という決まりです。このフラグは 2006 年 9 月の 6.3.0 で加わりました。
bit 11 が立っていない時、仕様は「元の ZIP の文字コード」、つまり IBM の Code Page 437 (CP437) に従うべきだとしています (付録 D)。CP437 は 1980 年代の IBM PC の欧文の文字の表で、日本語の字はありません。それでも日本語の名前の ZIP が数多く作られてきたのは、多くのソフトがフラグを立てずに、その PC の文字コード (日本語の Windows なら Shift_JIS 系の cp932) のバイトを名前の欄にそのまま書いてきたからです。開く側はフラグの無い名前を見て、どの文字コードかを推測するしかありません。推測が外れると文字化けになります。
直し方は 3 つに分かれます。開くツールで名前の文字コードを選び直す、文字化けを直した ZIP を作り直す、作る側が UTF-8 のフラグを立てるか英数字の名前にする、の 3 つです。以下、化け方の見分け方から順に説明します。
Windows と macOS で名前の書き方が違う
Microsoft の資料「Code Page Identifiers」によると、日本語の Windows は cp932 (コードページ 932、表の名は shift_jis) を使います。Python の zipfile の説明書も、名前を「その環境の文字コードやコードページ」で書く古い実装があり、それは主に Windows だと注記しています。
macOS 側はどうか。2026 年 10 月に macOS 26.5 で確かめると、標準で入っている ditto コマンドと zip コマンド (Info-ZIP の Zip 3.0) は、どちらも「写真リスト.txt」を UTF-8 のバイト列で書き、bit 11 を立てませんでした。名前は UTF-8 なのに、そのことを示すフラグが無い ZIP になります。
日本語の名前の書き方 (2026 年 10 月に確認):
- macOS 26.5 の ditto: 名前は UTF-8、bit 11 は立たない
- macOS 26.5 の zip (Zip 3.0): 名前は UTF-8、bit 11 は立たない
- Python 3.14 の zipfile: 名前は UTF-8、bit 11 は立つ
- Windows の古いソフト (Python の説明書の注記): 名前はその PC のコードページ (日本語なら cp932)、bit 11 は立たない
この一覧から、文字化けの典型の 2 つの向きが読み取れます。Windows で作った cp932 の ZIP を UTF-8 を前提とするツールで開くと化け、Mac で作ったフラグの無い UTF-8 の ZIP を cp932 を前提とするツールで開くと化けます。ただし開く側の推測が賢ければ化けません。同じ Mac の ditto で、cp932 の名前の ZIP を展開すると「写真リスト.txt」と正しく戻りました (日本語の環境で確認)。化けるかどうかは、作ったツールと開くツールの組み合わせで決まります。
Linux でも事情は同じです。Debian の unzip の説明書 (trixie) は、8 bit の文字を含む名前は、使う文字コードがツールや環境ごとに違うため、他の環境へ持ち運べないことがあると書いています。
化け方の形で原因を見分ける
化けた名前の字の形を見ると、どの文字コードをどう読み違えたかが分かります。「写真リスト.txt」を 3 通りに読み違えた結果を、Python 3.14 で再現しました。
| 見える名前 | 本当の文字コード | 読み違えた文字コード |
|---|---|---|
| 「Ä╩É^âèâXâg.txt」 | Shift_JIS (cp932) | CP437 |
| 「蜀咏悄繝ェ繧ケ繝�.txt」 | UTF-8 | Shift_JIS (cp932) |
| 「�ʐ^���X�g.txt」 | Shift_JIS (cp932) | UTF-8 |
- アクセント付きの欧文字と罫線の記号 (Ä や É、╩ など) が並ぶ時は、Shift_JIS の名前を仕様の既定どおり CP437 で読んでいます。Python の zipfile のように仕様に忠実なツールでよく起きます
- 見慣れない漢字と半角カナ (「繝」「縺」が目立つ) の時は、UTF-8 の名前を Shift_JIS で読んでいます。Mac で作ったフラグの無い UTF-8 の ZIP を、cp932 を前提とするツールで開くとこうなります。UTF-8 のかなとカタカナは E3 で始まる 3 バイトなので、Shift_JIS で読むと「繝」「縺」のような同じ字が何度も出ます
- 置き換え文字 (�) が多い 時は、Shift_JIS の名前を UTF-8 で読み、UTF-8 として成り立たないバイトが捨てられています。この形は元に戻せないことがあるので、展開する前にツールの側で文字コードを選び直すのが確実です
一度化けた名前のまま展開してしまうと、ファイル名は化けた字の列で保存されます。展開してから名前を直すより、元の ZIP を正しい文字コードで開き直すほうが早く、取りこぼしもありません。
直し方: 名前の文字コードを選び直して開く
いちばん手軽なのは、名前の文字コードを選べるツールで開き直すことです。piclab のZIP の解凍ツールは、ZIP の日本語のファイル名の文字コードを自動で判定して表示し、それでも化ける時は「ファイル名の文字コード」で Shift_JIS や GBK などを選び直せます。ファイルを選んで保存すれば、名前の文字化けを直した ZIP として保存できます。開く処理はすべてブラウザーの中で行うので、ファイルが外部に送られることはありません。
パソコンに Python 3.11 以降が入っていれば、標準の zipfile のコマンドでも直せます。Python の説明書によると、--metadata-encoding は 3.11 で加わった指定で、フラグの無い名前をどの文字コードで読むかを決めます (フラグが立っている名前には効かず、UTF-8 が優先されます)。
python3 -m zipfile --metadata-encoding cp932 -l archive.zip
python3 -m zipfile --metadata-encoding cp932 -e archive.zip out/1 行目で一覧を出して名前が正しく見えるかを確かめ、2 行目で out/ へ展開します。2026 年 10 月に、cp932 の名前で作った ZIP を Python 3.14 で試すと、指定の無い -l は Ä╩É^âèâXâg.txt と表示し、cp932 を指定すると「写真リスト.txt」と表示しました。Mac で作った UTF-8 の ZIP が化ける時は、cp932 の代わりに utf-8 を指定します。
中国語の ZIP なら gbk、韓国語の ZIP なら cp949 のように、作られた環境の文字コードを選びます。どれか分からない時は、「化け方の形で原因を見分ける」 の表から見当を付けます。文字コードの成り立ちは用語集の Shift_JIS で解説しています。
作る側の予防: UTF-8 のフラグを立てるか英数字の名前に
相手の環境が分からない ZIP を作る時は、名前の文字コードがはっきりした形で作ると、受け取った側の手間が減ります。
- UTF-8 のフラグを立てて作る: Python の zipfile は、ASCII 以外の字を含む名前を自動で UTF-8 にし、bit 11 を立てます (説明書と 2026 年 10 月の実測)。
python3 -m zipfile -c archive.zip 写真リスト.txtで作った ZIP はフラグ付きでした。フラグがあれば、仕様どおりに作られたツールは迷わず UTF-8 で読みます - 英数字だけの名前にする:
photo-2026-10-01.jpgのように ASCII の範囲の字だけで名前を付ければ、どの文字コードで読んでも同じバイトなので化けません。日付と番号を組み合わせた名前は、並べ替えにも強くなります - Mac から Windows へ送る時は試し開き: 「Windows と macOS で名前の書き方が違う」の一覧のとおり、macOS の標準の圧縮はフラグを立てない UTF-8 で書きます。送る前に、相手と同じ環境で開けるかを 1 度確かめるか、名前を英数字に変えてから圧縮します
写真をまとめて送る前に名前を英数字へそろえる時は、大量画像のファイル名一括変更術の手順が使えます。パスワード付きの ZIP をスマホで受け取る側の注意は、パスワード付き ZIP をスマホで開く方法にまとめています。
よくある質問: 7z や RAR では化けにくいのはなぜか
7z や RAR でも文字化けしますか。 起きにくい形式です。7-Zip の 7z の説明には特長の 1 つとして Unicode のファイル名が挙がっており、RAR 5.0 の形式の説明 (RARLAB) では、ファイルのヘッダーの名前の欄は UTF-8 で書くと定められています。7z は名前を Unicode で持ち、RAR 5.0 の書庫では名前が UTF-8 に決まっているため、ZIP のようにフラグの有無で読み方が割れることがありません。
中身のファイル (テキストや CSV) の文字化けも同じ原因ですか。 別の問題です。APPNOTE の付録 D は、bit 11 はファイルの中身にもパスワードにも文字コードを示さないと書いています。展開した CSV が Excel で化けるのは、CSV 自体の文字コードの問題なので、開く側で文字コードを指定して読み込みます。
ZIP にも UTF-8 の名前を別に持たせる仕組みはありますか。 あります。APPNOTE の付録 D は、Info-ZIP の Ed Gordon 氏が UTF-8 の名前を入れる追加の欄を 2 つ定めたと紹介しており、その 1 つは Header ID 0x7075 の Info-ZIP Unicode Path Extra Field です。bit 11 を立てずに、元の文字コードの名前と UTF-8 の名前を両方持たせられます。ただし対応はツールしだいで、2026 年 10 月に macOS 26.5 の ditto で作った ZIP を調べると、この欄は入っていませんでした。
化けた名前のまま展開してしまったら。 元の ZIP が残っていれば、「直し方: 名前の文字コードを選び直して開く」の方法で正しい名前で展開し直すのが確実です。ZIP を消してしまった後なら、名前を 1 つずつ手で付け直すしかありません。