ZIP解凍の文字化けを完全に直す手順(Shift_JIS/UTF-8切替)
MDN TextDecoder(Baseline 2015-07)+WHATWG Encoding Standardに基づく解説。
そもそもなぜ文字化けが起きるのか
ZIPは1989年にPKWAREのPhil Katzが作ったときから「ファイル名はOS依存の8ビット文字列として記録する」仕様でした。WindowsはShift_JIS、Macは古くからUTF-8、Linuxは環境変数依存です。結果としてWindowsのZIPをMacで開くと、Shift_JISのバイト列をUTF-8として解釈して文字化けします。
代表的な文字化けパターン
- 「縺ゅ′縺ヲ縺溘∂縺励>縺ァ縺吶」:Shift_JISをUTF-8として解釈した典型(縺=「あ」のShift_JIS第1バイト0x82+UTF-8解釈)。
- 「貉繧繧繧」:拡張漢字の連続。WindowsのZIPをLinuxで開いたケース。
- 「ソスソス」:U+FFFD置換文字。デコード失敗を文字単位で示している。
- 「????」:完全に読めず置換された状態。
仕様:bit 11(UTF-8フラグ)の役割
2006年のPKWARE APPNOTE v6.3.0で「general purpose bit flag」のbit 11に「Language Encoding Flag (EFS)」が追加されました。このビットが立っていればファイル名はUTF-8で記録されていることを意味します。立っていなければShift_JIS(日本語環境)またはCP-437(米国環境)と推測する必要があります。
本ツールはMDN DataView の getUint16(offset, true)(リトルエンディアン)でこのフラグを読み取り、UTF-8 / Shift_JISを判定します。
手動で切り替える手順
- ZIPを読み込み、ファイル一覧を表示。
- 文字化けしている場合は『日本語ZIP(Shift_JIS)』ボタンを押す。
- 逆にShift_JIS解釈が間違っていれば『標準(UTF-8)』ボタンに切替。
- 正しい表示になったら、ファイルを選んで取り出す。
自動判定の仕組み
本ツールはbit 11フラグを優先し、立っていない場合はShift_JISとUTF-8の両方でデコードして、U+FFFD(置換文字)の出現数が少ない方を採用します。WHATWG Encoding Standardの new TextDecoder("shift-jis", { fatal: false }) はChrome/Firefox/Safari全てで実装済み(Baseline 2015-07)。
Windows 11以降の改善
Windows 11(特に2022年以降のリリース)ではエクスプローラーで作るZIPのbit 11がデフォルトで立つようになりつつあり、文字化けは将来的に減ります。ただし古い圧縮ソフト(7-Zip旧版・LhaPlus等)で作られたZIPはShift_JISのままなので、当面は文字化け対応が必須です。
よくある質問
Q. 文字化けを直すと中身も壊れますか?
A. いいえ。文字化けはファイル名の解釈だけの問題で、ファイル本体(中身のバイト列)は無傷です。本ツールはファイル名のデコード方式を切り替えるだけで、中身は元のまま展開します。
Q. 「縺」が出るのはなぜ?
A. Shift_JISの「あ」(0x82 0xA0)をUTF-8として解釈すると、E3 81 82 → U+3041 ぁ(最初の3バイト)になります。Shift_JIS第1バイト0x82は3バイトUTF-8シーケンスの開始位置に近く、「縺」「ぁ」「ぇ」などひらがな付近の文字が現れやすい構造です。
Q. 手動切替で直らない場合は?
A. CP-437(米国向け古いZIP)やEUC-JPなど、Shift_JIS/UTF-8以外の可能性があります。元のZIP作成者にUTF-8で作り直してもらうのが確実です。