Mac の zip が Windows で文字化け・濁点が分離する原因と直し方
Mac の zip を Windows で解凍したときにファイル名が文字化けする場合、原因は2つあります。「データ一覧.xlsx」が「繝・・繧ソ荳隱ァ.xlsx」のような意味不明な文字列になるなら、解凍ソフトが文字コードを読み間違えています。7-Zip など UTF-8 に対応した解凍ソフトで解凍し直せば、たいてい直ります。一方、名前は正しく見えるのに検索でヒットしない、Web サービスにアップロードできない、「プレゼン資料.pptx」が同じフォルダーに2つ並ぶ、といった症状なら、濁点・半濁点がかなと別の文字として保存されている状態(が → か + ゛)で、解凍し直しても直りません。この場合はファイル名の「正規化」が必要です。同じ zip で両方が同時に起きることもあるので、まずどちらなのかを見分けるところから始めます。
Mac の zip が Windows で文字化けする2つの原因
zip 形式には「ファイル名はこの文字コードで書く」という統一ルールがありません。圧縮するソフトが書き方を決め、解凍するソフトが読み方を決めます。Mac と Windows は長年ここで別の選択をしてきたため、日本語のファイル名はちょうどその境目に当たります。
原因1:文字コードの読み違い(いわゆる文字化け)
Finder でフォルダーを右クリックして「圧縮」を選ぶと、macOS はファイル名を UTF-8 で zip に書き込みます。ところが古い Windows のエクスプローラーや、一部の解凍ソフト(Lhaplus など古くからあるソフトの古いバージョン)は、zip 内の名前を日本語 Windows 標準の Shift_JIS(CP932)とみなして読みます。UTF-8 のバイト列を Shift_JIS として解釈すると、「テスト」が「繝・せ繝・」のような漢字混じりの文字列に化けます。「繝」「縺」「繧」といった見慣れない漢字が並んでいたら、ほぼ間違いなくこのパターンです。
これは表示と解凍の問題だけです。zip の中身のデータ自体は壊れておらず、解凍したソフトの推測が外れただけです。
原因2:濁点・半濁点の分離(NFD)。見た目は正常でも別物
解凍がうまくいっても、もうひとつ静かな問題が残ることがあります。macOS は濁点付きのかなを「基本のかな + 結合用の濁点」という2つの Unicode 文字として保存する傾向があります。「デ」なら「テ」+「゛」、「プ」なら「フ」+「゜」です。この形式を NFD(分解形)と呼びます。一方、Windows・Web ブラウザー・ほとんどのサーバーは「デ」1文字の NFC(合成形)を前提にしています。
Windows は「テ + 結合濁点」という名前のファイルを問題なく作成します。画面上は「デ」と表示されるので何も異常に見えません。しかしファイルシステムにとっては、Windows のキーボードで打つ「デ」とは別の文字列です。その違いは後から表面化します。
- Windows の検索ボックスで「データ」と入力しても、そのファイルが出てこない。
- Excel の VLOOKUP やスクリプトでファイル名を照合すると、濁点を含むファイルだけ一致しない。
- 解凍したフォルダーを既存のフォルダーに重ねると、「プレゼン資料.pptx」がサイズも日付も違う状態で2つ並ぶ。
- 社内ポータルや電子申請サイトでアップロードが拒否される、または URL に「%E3%82%99」のような妙な文字列が入る。
症状がこのリストに当てはまるなら、解凍し直しても意味がありません。解凍後にファイル名を NFD から NFC に変換する必要があります。
どちらの問題か見分ける方法
ファイル一覧を見るだけで、たいてい判断できます。
- 読めない漢字や記号が見えている(「繝」「縺」「繧ソ」「・」など):原因1の文字コード問題です。次のセクションへ進んでください。
- 名前は普通に見えるのに動作がおかしい:原因2の NFD の可能性が高いです。PowerShell で確認できます。
$name = (Get-Item -LiteralPath "C:\Users\ユーザー名\Downloads\解凍済み\データ一覧.xlsx").Name
$name.Length
$name.IsNormalized([Text.NormalizationForm]::FormC)
怪しいファイルのパスを貼り付けて実行します。「データ一覧.xlsx」は見た目では10文字ですが、「デ」が分離していれば Length は 11 になり、IsNormalized は False を返します。濁点・半濁点の数だけ文字数が増えるのが特徴です。
マウス操作で済ませたい場合は、エクスプローラーでそのファイルを選んで F2 を押し、「デ」の直後にカーソルを置いて Backspace を1回押してみてください。濁点だけが消えて「テ」が残れば、濁点が別の文字として保存されていた証拠です(確認後は Esc で名前の変更をキャンセルします)。
文字化けの直し方:UTF-8 対応の解凍ソフトで解凍し直す
化けた名前のまま解凍したフォルダーは、コピーが二重にならないよう先に削除してから、元の .zip を UTF-8 の名前を読めるソフトで解凍し直します。
7-Zip(無料・Windows)
- 7-Zip を公式サイトからインストールします。
- エクスプローラーで zip を右クリックし、7-Zip › ここに展開 を選びます(Windows 11 では先に その他のオプションを表示 を押す必要があります)。
- 解凍された名前を確認します。「繝・・繧ソ荳隱ァ.xlsx」が「データ一覧.xlsx」になっていれば成功です。
Windows 10 / 11 の標準機能
最近の Windows は、以前のバージョンに比べて zip 内の UTF-8 名の扱いが大きく改善されています。最新の Windows を使っている同僚が同じ zip を文字化けなしで解凍できるなら、問題はファイルではなくあなたの解凍ソフト側です。エクスプローラーの すべて展開 を試すか、PowerShell で次を実行します。
Expand-Archive -LiteralPath "C:\path\to\archive.zip" -DestinationPath "C:\path\to\output"
7-Zip でも化ける場合
まれに、Mac 側で古い圧縮ソフトや特殊な設定を使っていて、UTF-8 以外の文字コードで名前が書かれていることがあります。7-Zip や WinRAR には zip を開くときにコードページを指定する機能があるので、日本語(Shift_JIS)や UTF-8 を切り替えて正しく読める設定を探します。どうしても直らなければ、送り主に Finder の「圧縮」か Terminal の zip -r で作り直してもらってください。どちらも UTF-8 で名前を書きます。
名前が正しく表示されるようになったら、前のセクションの NFD チェックも実行しておきます。原因1を直した下に原因2が隠れていた、というケースは珍しくありません。
解凍後に濁点・半濁点の分離を直す方法
ここでは「テ + 結合濁点」を「デ」1文字にまとめます。フォルダー内の濁点・半濁点付きのかなをすべて一括で変換するやり方は、実用上2通りあります。
方法A:PowerShell で一括リネーム(追加ソフト不要)
指定したパス以下のすべてのファイルとフォルダーの名前を NFC に変換します。大事なフォルダーなら、まずコピーで試してください。
$root = "C:\path\to\解凍済み"
Get-ChildItem -LiteralPath $root -Recurse |
Sort-Object { $_.FullName.Length } -Descending |
ForEach-Object {
$fixed = $_.Name.Normalize([Text.NormalizationForm]::FormC)
if ($fixed -ne $_.Name) {
$target = Join-Path $_.Directory.FullName $fixed
if (Test-Path -LiteralPath $target) {
Write-Warning "スキップ(同名ファイルが既に存在): $($_.FullName)"
} else {
Rename-Item -LiteralPath $_.FullName -NewName $fixed
}
}
}
このスクリプトの動作について:
- 階層の深いものから先に名前を変えるので、フォルダー名を変えた結果、中のファイルのパスが無効になることがありません。
- 正しい名前のファイルがすでにある場合(「プレゼン資料.pptx」が2つある状態)は上書きせずスキップし、手作業で統合すべきファイルを警告として表示します。
-LiteralPathは必須です。これがないと、ファイル名に含まれる角かっこがワイルドカードとして誤解釈されます。.ps1ファイルとして保存する場合は、日本語のパスが化けないよう UTF-8(BOM 付き)で保存してください。
方法B:解凍する前に zip そのものを直す
スクリプトを動かしたくない場合や、修正済みの zip をそのまま他の人に渡したい場合は、FilenameFixer の ZIP ファイル名復元ツールが使えます。Mac で作った元の zip(200 MB まで)をブラウザーで読み込むと、中の分離した名前を NFC に書き換えた zip をダウンロードできます。処理はブラウザー内で行われ、zip がサーバーにアップロードされることはないので、取引先の契約書や人事関係のファイルが入った zip でも扱いやすい設計です。無料で使え、すでに解凍済みのフォルダーがある場合は、同じ Web アプリにファイルをドラッグ&ドロップして一括リネームすることもできます。
どちらの方法でも結果は同じで、Windows の検索・スクリプト・Web フォームが普通の「デ」「プ」「ガ」として扱える名前になります。この変換は日本語のかなに限らず、韓国語の名前が「ㅎㅏㄴㄱㅡㄹ」のように分解されて届く問題や、フランス語・ドイツ語などのアクセント付き文字(é → e + ◌́)の分離も同じ仕組みで修復できます。海外の取引先や同僚から届く zip で見かけたら、同じ手順で対処できます。
次の zip で同じ問題を起こさないために
多くは送る側で防げますが、すべてではありません。
- 送り主に Finder の「圧縮」か Terminal の
zip -rで圧縮してもらう。 どちらも UTF-8 で名前を書くので、最近の Windows なら文字化け(原因1)のリスクはほぼなくなります。ただし NFC への正規化は行われないため、濁点の分離(原因2)は残り得ます。 - OS をまたぐファイル名では、可能なら濁点・半濁点のかなや全角記号を避ける。 「data_list.xlsx」ならどの環境でも無事です。ただしこれは回避策であって解決ではなく、人名や正式な書類名に濁点が含まれる場合は選べません。
- アップロード時に直す。 本当に困っているのが「Web ポータルが Mac のファイルを受け付けない」ことなら、FilenameFixer の Chrome 拡張機能が、Web サイトでファイルをアップロードする際にファイル名を自動で NFC に変換します。ポータル側には「デ」が1文字として渡ります。
- 開発者向け: アップロードを受け付けるサーバー側で、ファイル名を NFC に正規化してから保存してください。macOS と Windows のチェックアウト間でパスを比較するビルドスクリプトや同期スクリプトも同様です。Python なら
unicodedata.normalize("NFC", name)、.NET ならString.Normalize()が定番です。Git には、Mac でクローンしたリポジトリで同じ問題を扱うcore.precomposeunicodeという設定があります。
正直に書いておくべき限界がひとつあります。Windows ユーザーが分離した名前のファイルを何か月もそのまま編集・保存していた場合、後から変換すると、正しい名前で保存された同じ書類とぶつかることがあります。上の PowerShell スクリプトも ZIP ツールも、その場合は元のファイルをそのまま残しますが、2つのバージョンをどう統合するかは手作業になります。ここで説明したように解凍の時点で zip を捕まえておくほうが、後からほどくよりはるかに手間が少なくて済みます。