ZIP のファイル名が文字化けする原因と直し方 - Shift_JIS と UTF-8

· 約 5 分で読めます

結論: 化けるのはファイル名の文字コードが食い違うから

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 で再現しました。

「写真リスト.txt」の化け方
見える名前本当の文字コード読み違えた文字コード
「Ä╩É^âèâXâg.txt」Shift_JIS (cp932)CP437
「蜀咏悄繝ェ繧ケ繝�.txt」UTF-8Shift_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 つずつ手で付け直すしかありません。

関連記事

パスワード付き ZIP をスマホで開く方法 - iPhone と Android の手順と開けない時の原因

パスワード付き ZIP を iPhone と Android で開く手順を、標準のアプリ、専用のアプリ、ブラウザーの 3 つの方法に分けて解説。開けない時の原因 (ZipCrypto と AES、分割 ZIP、パスワードの文字コード、破損) の見分け方もまとめます。

大量画像のファイル名一括変更術 - OS 標準機能からスクリプトまで

数百枚の画像ファイル名を効率的にリネームする方法を、OS 標準機能、コマンドライン、Python スクリプトなど手段別に解説します。

ブラウザーでの画像処理の仕組み - Canvas API、ImageData、Web Workers 活用ガイド

ブラウザー内で画像処理を行う技術的な仕組みを解説。Canvas API によるピクセル操作、ImageData の構造、Web Workers によるオフスレッド処理、OffscreenCanvas の活用方法を紹介します。

7z と ZIP と RAR の違い - 圧縮率と速度と互換性で選ぶ

7z と ZIP と RAR の違いを、OS の標準の対応、圧縮の方式、暗号化、ソリッド圧縮、作るのに必要なソフトの 5 点で比べた 1 枚の表から解説。文書での実測の圧縮率と速度、相手に送る時と自分で保管する時の選び方もまとめます。

画像 OCR とは - テキスト抽出の仕組みと Tesseract 実装ガイド

OCR (光学文字認識) で画像からテキストを抽出する技術を解説。Tesseract、Google Cloud Vision、深層学習 OCR の精度比較と、前処理による認識率向上テクニックを紹介します。

メール添付用画像の圧縮ガイド - 容量制限を守りつつ画質を保つ方法

メール添付時の画像圧縮テクニックを解説。容量制限内に収めながら画質を維持する具体的な手順と、ビジネスシーン別の推奨設定を紹介します。

関連用語