Chapter 13

DLC3: ZIPファイルと文字化け

zetamatta
zetamatta
2021.04.25に更新

WindowsTerminal と絵文字ネタが続きましたが、どう考えても「終わらない物語」になるので、もう当面やりません。今回の DLC3 のテーマは ZIPファイルです。

Macユーザさんとファイルのやり取りをやったことはないのですが、聞くところによると ZIP ファイル内のファイル名が文字化けを起こすという痛ましい事故が時折発生しているようです。しかしながら、これは Mac も Windows も悪くないのです。過去の互換性の都合、そうなってしまったのです。

ずばり、ZIPアーカイブ内のファイル名の文字コードは

現在のコードページの文字コード or UTF8 の二択です(情報量ゼロ

正確には、元々は何も考えず「現在のデフォルトのマルチバイト文字列のコード」しか使っていなかったのを、後からUTF8ファイル名使えるようにしたという形になります。ウィキペによると PKWAREのZIP規格では 6.3.0 からとのことです。どちらの文字コードが使われているかについては、ファイルエントリごとに、UTF8フラグというフィールドが用意されており、それで判断するというルールになっています。

Windows の圧縮フォルダー

  • 展開は現在のコードページのコード、UTF8 どちらでも大丈夫(フラグを見て判断)
  • 圧縮は現在のコードページのコード(つまり、NonUTF8)

「圧縮もデフォルトで UTF8 にしてくれよ!」と言いたいところですが、どうやら過去のアプリケーションとの互換性と他のOS環境との親和性を天秤にかけて前者が取られてしまったようです。一つの判断ではありますが、残念ですね。

なので、Macユーザと Windows ユーザとの紛争が起きる原因は

  • Windows → Mac
    • ファイル名に UTF8 が使われていない
  • Mac → Windows
    • UTF8フラグがセットされていない(おそらく稀では?)
    • UTF8フラグを認識していない展開ツールを使っている

といったところであると思われます。

ZIP.EXE と UNZIP.EXE (Info-ZIP)

本家のようで、実は本家ではないコマンドラインツール info-ZIP の ZIP.EXE と UNZIP.EXE ですが…

UNZIP.EXE(Info-ZIP) では 2009年リリースの 6.00 から UTF8ファイル名が正しく展開できるようになっていますが、5.51 ではUTF8ファイル名を含む ZIPファイルは壊れているとみなされる場合がありました。フラグが問題ではなくファイル名がおかしいと判断されるのでしょう。ただし、現行の UNZIP 6.00 でも、表示されるログは UTF8 のファイル名をそのまま文字コード変換なしに ANSI系APIに出力してしまうせいか、見事に化けます。実際に展開されたファイル名は適切な名前になっているとはいえ、ドキっとするので何とかしてほしいですね。

ZIP.EXE は ZIP 3.0 から UTF8ファイル名がサポートされたようです。で、こちらはファイル名はどうなっているかというと… Windows ではデフォルトでは NonUTF8 のようです、残念!
(なお、新しめのUNIX系の zip だとちゃんと UTF8 フラグがセットされている模様)

とはいえ、Windows でも UTF8のファイル名で格納させることも可能で、-UN=UTF8 というオプションをつければよいようです。このオプションの存在は普通のヘルプでは説明されず、zip -h2 という詳細ヘルプでないと出ないようです。うーむ、なんか、やっぱりいろいろめんどくさいですね!