会社員だった頃(いまも会社員なのかもしれないが😎)、デザイナーさんたちからzipファイルが添付されてきて、毎回文字化けのzipファイルになっていてがっかりする😱という事象がありました。最近はろくに仕事もしていないので、こういう場面に出くわすこともほぼありませんでした。
今日、1年ぶりくらいでこの事象に出くわしたので、ちょっと調べることにしました。
もう少し詳しく述べるなら、Macで作成されたzipファイルをWindowsやUbuntuで展開すると、日本語のファイル名が「文字化け」するというトラブルです。OS側の問題っぽので、WSL内のUbuntuでunzipすればうまくいくんじゃないかなと思っていたのですが、アテが外れました😨
この事象、結論はZIPファイル内部で使われている文字コードの違いが原因です。
なぜ文字化けが起きるのか
| OS | ファイル名の文字コード | 備考 |
|---|---|---|
| macOS | UTF-8 | 仕様に準拠 |
| Windows(エクスプローラーの標準展開機能) | CP932(Shift_JIS系) | UTF-8に未対応 |
| Ubuntu(unzipコマンド) | UTF-8 | ただしmacOSの拡張形式(NFD)に弱い |
macOSはZIPファイル内のファイル名をUTF-8(かつNFD正規化)で格納しています。
NFD正規化とは、文字を基底文字と結合文字に分解して表現する方式です。例えば「が」をNFCでは1文字(が)で表現しますが、NFDでは2文字(か+゛)に分解します。
macOSはNFDを使い、WindowsやLinuxはNFCを使うため、この違いがZIPファイルの文字化けの原因にもなります。
- Windows標準の解凍機能はUTF-8に対応していないため、Shift_JISとして誤って解釈 → 文字化け
- UbuntuのunzipもNFD(濁点や長音などを分解する形式)をうまく扱えない場合があるそうです。
代表的な解決方法
1) Windowsの場合 7-Zipを使う(最も手軽)
7-ZipはUTF-8に対応しているため、Macで作られたZIPも正しく展開できます。
👉 会社PCなどでインストールできない場合は、Portable版(インストール不要)もあります。
自分はPortable版の7-Zipをを使用していました。
2) Ubuntuの場合 unarコマンドを使う
unzipではなく unarを使うと、NFDも含めてかなり正確に展開できます。
# インストール方法 $ sudo apt update $ sudo apt install unar # 展開する場合 $ unar filename.zip
メリット
3) Macで再圧縮する(NFC対応したアプリで)
面倒ですが、先方にお願いするって話🙇
おわりに
Windowsに修正してほしいなと思うところは多いですが、もう正解なんてないんじゃないっすかね。もしあるとすれば、zipファイルを辞めることくらいしか?
個人的にはMac側のNFD変換は勘弁してほしいし、__MACOSXフォルダも…。
| 対応方法 | 対応環境 | メリット |
|---|---|---|
| 7-Zipで展開 | Windows | 最も手軽で確実 |
| unarで展開 | Linux/Ubuntu | UTF-8/NFD対応 |
ちなみに、zip以外の他のアーカイブ方式ではどうかというと
- tar.gz(tar + gzip) … ファイル名をバイト列としてそのまま保存するため、UTF-8で作られたものはUTF-8として展開され、文字化けは発生しにくい。ただしNFD/NFCの問題は残ります。
- 7z形式 … UTF-8をネイティブサポートしており、文字化けはほとんど発生しません。macOSとWindows間でのファイル共有には最も推奨される形式の模様。
- RAR形式 … 新しいバージョンではUTF-8対応しており、比較的安全。
みたいですね。
ちょっとしたTips?
実験してはいないですが、検索していると以下の記述がありました。
- MacユーザにZIPを送ってもらう場合、「ターミナルで圧縮」するようお願いすると、余計なリソースフォーク(
__MACOSXフォルダ)が入りにくくなります zip -rで圧縮してもらうと、Windows側でのトラブルが減ります
という話。