5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

7-Zipでファイル名がUTF-8で記録されたZIPファイルを作成する

Posted at

先日の出来事

母「2年分の議事録を見やすい感じでメールに添付して!」
ぼく「普通にZIP形式でいいか…『送る』から『圧縮(zip形式)フォルダー』…待てよ、宛先のメールアドレスのドメインが icloud.com だ、Macを使っている可能性が高めに感じる。適当に作ったファイルだと文字化けするかもしれない。中身をチェックするか…あーUTF-8フラグ立ってないな…しかもこの感じだとUTF-8じゃないな…7-Zipで圧縮すればいい感じにしてくれるかな…あーダメだ、同じ感じだ…あーもういいや、時間無いしこのままでいいや!(『送る』で作成したZIPファイルを添付)」

その後、今のところ怒られ・文句・クレームなどは受けとっていない。
相手がMacを使っていたか、そして文字化けしたかどうかはわからない。

環境

  • Windows 11 Home 22H2
  • 7-Zip 23.01 (x64)

×:Windows標準の「送る」を使う

「送る」→「圧縮(zip形式)フォルダー」で圧縮する。

「圧縮(zip形式)フォルダー」で圧縮

すると、ファイル名はShift_JISで記録された。(画像赤枠)

「圧縮(zip形式)フォルダー」で圧縮した結果

これをCyberChefで展開すると、ファイル名は文字化けしてしまった。

「圧縮(zip形式)フォルダー」で圧縮してCyberChefで展開した結果

また、さくらのクラウドシェルunzip コマンドによる展開でも、ファイル名は文字化けしてしまった。

「圧縮(zip形式)フォルダー」で圧縮してさくらのクラウドシェルで展開した結果

△:7-Zipで普通に圧縮する

7-Zipのコンテキストメニュー「"○○.zip"に圧縮」で圧縮する。

7-Zipで普通に圧縮

メインのファイル名はShift_JISで記録された (画像赤枠) が、UTF-8のファイル名も Info-ZIP Unicode Path Extra Field として記録された。(画像青枠)

7-Zipで普通に圧縮した結果

これをCyberChefで展開すると、ファイル名は文字化けしてしまった。

7-Zipで普通に圧縮してCyberChefで展開した結果

しかし、さくらのクラウドシェルunzip コマンドによる展開では、ファイル名の文字化けを回避できた。

7-Zipで普通に圧縮してさくらのクラウドシェルで展開した結果

○:7-Zipでパラメーターをつけて圧縮する

WindowsとMacのZIPファイルの文字化け問題とその解決策 | Gift by Gifted
で紹介されていた方法である。

7-Zipのコンテキストメニュー「圧縮…」を選択する。

7-Zipで圧縮

さらに、以下の設定を行って圧縮する。

  • アーカイブ形式を「zip」にする
  • パラメーターを cu=on にする

7-Zipで圧縮 2

すると、メインのファイル名がUTF-8で記録された。(画像赤枠)
さらに、general purpose bit flag のUTF-8フラグ (Language encoding flag) も立っていることが確認できる。(画像青枠)

7-Zipで圧縮した結果

しかし、これをCyberChefで展開すると、やはりファイル名は文字化けしてしまった。

7-Zipで圧縮してCyberChefで展開した結果

さくらのクラウドシェルunzip コマンドで展開すると、文字化けはしなかったが、変なメッセージが出てしまった。
(local file header でも central directory header でも同様の general purpose bit flag とファイル名のデータが記録されているため、一方だけファイル名が уБнуБУ.txt だというメッセージの主張は変である)

7-Zipで圧縮してさくらのクラウドシェルで展開した結果

まとめ

7-Zipのパラメーター cu=on を用いることで、ファイル名がUTF-8のみで記録され、UTF-8フラグも立ったZIPファイルを作成することができた。
「ファイル名がUTF-8で記録されたZIPファイルを作成する」という目的では、これがやりたかったことである。

しかし、「互換性が高く、自然に展開できるZIPファイルを作成する」という目的では、このやり方が最善とは限らない。
今回の検証では、このやり方でメインのファイル名をUTF-8で記録したZIPファイルを作成しても、CyberChefでの文字化けは解消できなかったし、さくらのクラウドシェルでは変なメッセージが出てしまった。
さらに、(確かめてはいないが)古いWindows環境では、逆にUTF-8に対応しておらず、文字化けしてしまうかもしれない。
そう考えると、パラメーターを使わずに7-Zipで普通に圧縮して生成した、メインのファイル名はShift_JISで記録し、別にUTF-8のファイル名も格納する形式の方が、多くの環境で受け入れられやすいかもしれない。
とはいえ、メインのファイル名をUTF-8で記録する形式には対応しているが、この形式には対応していない環境もあるかもしれない。

本当に多くの環境で使ってもらいたければ、そもそもファイル名に文字化けを気にするような文字を使わず、ASCIIで表現できる文字のみを使ったものを圧縮するのがいいだろう。

それにしても、ファイル名をShift_JISのみで記録する「送る」は、ファイルサイズの観点からは良いかもしれないが、互換性の観点からは最悪であるといえよう。
7-Zipでも圧縮を行ったにも関わらず、結果をよく確認せずにメインのファイル名のみを見て「UTF-8で記録されていない」と思い込み、「送る」で作成したZIPファイルを採用してしまった自分は愚かだったなあ。

5
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?