今回は、Macさんからもらった ZIP ファイルを文字化けなして展開するバッチを作成しました。
Mac さんからの ZIP でファイル名が文字化けしちゃう問題
最近は、デザイナーやエンジニアに限らず、一般のビジネスシーンでも Mac を当たり前に使うユーザは多くなっています。 そんな Mac さんたちと文書やデータをやり取りする機会も増えたのではないでしょうか。
そのとき必ず遭遇するのが、 Macさんから貰った ZIP ファイルが、Windows 側で展開(解凍)すると、なぜか中身の日本語ファイル名が文字化けする、という問題です。
これは昔からある問題で、両者で使っている文字コードが macOS (UTF-8)と Windows(Shift_JIS)というように異なるのが原因なのでした。
Windows の UTF-8 対応が改善されたということで、状況は改善されたのでしょうか。
Windows の標準機能だけで Mac さん ZIP を開きたい
残念ながら Windows 11 になっても Mac の ZIP ファイルは文字化けします。
対処方法をネットで調べると、「UTF-8 に対応している圧縮ソフトを使う」か、「Windows 側のシステムロケールの設定でシステムの文字コードを UTF-8 に変更する」方法が紹介されています。
ZIP 圧縮・展開は OS の標準機能なのに、同じことをするアプリを別途インストールするというのも気が進みません。 またそれで ZIP のアイコンや紐づけが変わるのもモヤッとします。 そもそも、アプリのインストールに申請が必要な組織もあり、 ZIP ファイルを開くためだけにハンコをもらうのも面倒なことです。
また、 システムロケールの設定変更するというのも、その影響範囲が大きすぎて気が進みません。 古いアプリでは UI 表示がおかしくなるばかりか、既存データが破損する可能性さえ考えれらます。 Mac の ZIP ファイルを開くためだけに、そんなリスクを負えたものではありません。 そもそもこの設定変更は技術者の検証用のベータ版公開で、一般ユーザにはまだ推奨されもいないのです。
いずれにしろ、本当は OS 側で対処されるはずの問題なのに、ユーザが余計な仕事を強いられていることに変わりはありません。
いつか改善されるのかもしれませんが、待っていられないので、本記事では Mac の ZIP ファイルを文字化けなしで展開するバッチを作成することにしました。
これなら今の Windows の標準機能のみで動作するので、 アプリのインストールやシステムの設定変更も必要ありません。
【免責】
本記事に掲載のバッチスクリプト(本バッチ)の使用によって生じたいかなる損害・損失についても本ブログの著者は責任を負いかねますので予めご了承ください。
本バッチは十分は検証を経ておらず、エラー処理も省略しています。
本バッチはあくまで個人の業務効率化のために供するものであり、事業や組織のシステムに組み込んだり運用管理作業の自動化等での使用はご遠慮ください 。
【セキュリティ上の注意】
本バッチは読者の所属する組織のセキュリティポリシーによっては使用を許容されない場合があります。 使用に際してはシステム管理者やセキュリティ責任者に相談し、その指示に従ってください。
また本バッチを他者と共有する場合は、本ブログの URL を伝えるようにしてください。 本バッチに限らず、バッチファイルをメールやチャットで送信したり、共有フォルダやクラウドに公開するなどファイル自体を共有してはいけません。 また安全が確認できないバッチファイルは決して実行しないよう注意してください。
Mac の ZIP ファイルを文字化けなしで展開すバッチ
以下のスクリプトをバッチとして保存し、Mac で圧縮した ZIP ファイルをドラッグ&ドロップすると、文字化けなしで展開(解凍)されます。
複数の ZIP ファイルでも、まとめてドラッグ&ドロップすれば一括処理できます。
@setlocal&set "a=%*"&powershell -nop "'&{#'+(gc \""%~f0\"" -raw)+'} '+($Env:a -replace '(?=[''(){},;`$&])','`')|iex"&pause&exit/b $ErrorActionPreference = 'Stop' # Extract Mac Zip Add-Type -AssemblyName System.IO.Compression.FileSystem function mac_unzip($maczip, $toDir) { $utf8 = [System.Text.UTF8Encoding]::new($false) [System.IO.Compression.ZipFile]::ExtractToDirectory($maczip, $toDir, $utf8) $items = (Get-ChildItem -LiteralPath $toDir -Recurse | Sort-Object -Property FullName -Descending) foreach ($item in $items) { if (!$item.name.isNormalized()) { $norm = $item.name.normalize() Rename-Item -Path $item.fullName -NewName $norm -Force } } } foreach ($file in Get-ChildItem -Path $args) { if (Test-Path -LiteralPath $file -Include '*.zip' -Type Leaf) { $macZip = $file.fullName $toDir = $file.directoryName + "\" + $file.baseName.normalize() New-Item -Path $toDir -ItemType Directory > $null echo $toDir mac_unzip $macZip $toDir } }
間違って Windows の ZIP ファイルをドラッグ&ドロップしないよう、注意してください。逆に文字化けしてしまいます。
ファイルやフォルダを UTF-8 の ZIP ファイルとして圧縮するバッチ
ついでに UTF-8 で圧縮するほうのバッチも用意しました。
このバッチにファイルやフォルダをドラッグ&ドロップすると、中のフォルダ名やファイル名が UTF-8 で 保持されている ZIP ファイルができます。
この ZIP ファイルは、 Mac はもちろん、 Windows でも文字化けなしで展開できます。
@setlocal&set "a=%*"&powershell -nop "'&{#'+(gc \""%~f0\"" -raw)+'} '+($Env:a -replace '(?=[''(){},;`$&])','`')|iex"&pause&exit/b $ErrorActionPreference = 'Stop' # Zip with UTF-8 $items = ($args | Get-Item | Sort-Object -Property Name) if ($items.Count -gt 0 ) { $zip = [IO.Path]::ChangeExtension($items[0].fullName, ".zip") echo $zip Compress-Archive -Path $items -DestinationPath $zip }
【注意】
長いファイル名のファイルや深い階層を持つフォルダをこのバッチで圧縮すると、その ZIP ファイルを Windows で開こうとしたときにエラーとなって開けなくなる可能性があるので注意してください。
Windows で使用可能なファイル名の長さはフォルダ名(パス)も含めて 260 文字までとなっていますが、ZIP ファイル(圧縮(zip形式)フォルダー)では制限がもっと厳しくなり、全て日本語文字だった場合に約半分の 130 文字程度で限界となります。
上記圧縮バッチはその日本語の制限なしで圧縮できるのですが、それをエクスプローラーで展開するとエラーになります。
もしそうなってしまったら、C:\ 直下にZIPファイルを置いて、上記1個目のバッチを使って開いてみてください。
ちなみに Mac なら問題なく開けるはずです。
使い方
上記のバッチをテキストエディタにコピー&ペーストし、好きなファイル名を付けて拡張子「.bat」にし、デスクトップなどに保存して下さい。
あとはそのバッチのアイコンに、展開したい ZIP ファイルをドラッグ&ドロップするだけです。
もとの ZIP ファイルと同じ場所に同名のフォルダーとして展開され、中の日本語ファイル名は文字化けしません 。
もし、同名のフォルダがすでに存在したらエラー(赤字)になり、処理は中断されます。
コンテキストメニューの「送る」へバッチを登録すると、右クリックから実行できて便利でしょう(後述)。
以下、使用上の注意点があります。
- パスワードがかかっている ZIPファイルには対応していません
- Windows で圧縮した ZIP ファイルは本バッチで展開しないでください(かえって文字化けします)
- ダウンロードした ZIP ファイルをこのバッチで展開すると、保護ビューが外されてしまいます。Excel のファイルなどはいったん提供者に安全性を確認してから開くようにしてください。
【Note】「送る」メニューへの登録
このバッチを毎日使うようなら、コンテキストメニューの「送る」メニューに登録しておけば、ファイルの右クリックからから実行できて便利です。
バッチを「送る」メニューに登録するには、バッチファイルを「SendTo」フォルダ内に保存(移動)します。 「SendTo」フォルダは、エクスプローラ(フォルダウィンドウ)のアドレスバーに「sendto」と入力すると開けます。
これでどこからでも、展開したい ZIP ファイルのアイコンで右クリックして、メニューを辿ればバッチを実行できるようになります。
キー操作のみで「送る」メニューを開くには、キーボードの右下の方にあるメニューキー(アプリケーションキー)を押してからN
キーを押します 。 もしキーボードにメニューキーがなければF10
キー(Windows 11 の場合Shift
+F10
)が使えます。
ところで Windows 11 になってからコンテキストメニューの内容が整理され、これまでのメニューにアクセスするには最下部の「その他のオプションを表示」から間接的にたどらなければいけなくなりました。
Windows 11 で従来のコンテキストメニューを一発で直接出したければ、マウス操作ならShift
キーを押しながら右クリック、キー操作ならShift
+F10
をタイプします。
あるいはキーボードに メニューキー(アプリケーションキー)があるのなら、それで今まで通りコンテキストメニューを出せるようです。
なぜ ZIP が文字化けするのか
2番目のバッチを使って圧縮したZIPファイルは、UTF-8 で保存されているにも関わらず Windows でも文字化けなしで開けます。
これはどういうことでしょうか。
実は、最近の Windows は UTF-8 の ZIP ファイルにも対応していて、そのまま正しく開けるようになっているのです。
ではなぜ Mac の ZIP ファイルだと文字化けするのでしょうか。
ZIP ファイルの仕様によれば、中のファイル名で UTF-8 を使っているならオンに設定するフラグが用意されています。
Windows はこのフラグを確認して、 UTF-8 を使うかどうかを判断しています。
ところが macOS は UTF-8 にも関わらずこの UTF-8 フラグを付けません。
そのため、Windows では UTF-8 であることに気付けずに、シフト JIS としてファイル名を解釈して文字化けとなるのです。
つまり、 ZIP の文字化けは文字コード違うから仕方のない事ではなく、 macOS がサボらずに UTF-8 フラグを付けてくれさえすれば済む話だったのです。
macOS にはちゃんと ZIP の仕様を守ってもらいたいですね、ホントに。
ところで Windows 10 からはシステムロケールの設定で文字コードを UTF-8 に 変更できるのでした。
その状態で ZIP 圧縮をするとどうなるのでしょうか。
やってみると、中身はちゃんと UTF-8 の ZIP ファイルになっていています。もちろん Mac で開いても問題ありません。
では Windows のシステムロケールの設定を元に戻してから、その ZIP ファイルを開くとどうなるでしょうか。
文字化けします。
Windows も UTF-8 フラグを付けていないということです。
人のこと言えませんでした。
まとめ
本記事では Mac で圧縮された ZIP ファイルを文字化けなしで展開するバッチを作成しました。
Windows は標準で UTF-8 ZIP に対応できる機能をもともと持っており、それをバッチとして呼び出せるようにしたものです。
面倒なインストールやシステム設定なしで使えるので、パソコンに詳しくない人でもお手軽に利用できると思います。
将来的にも macOS が UTF-8 フラグを付けてくれることはなさそうです。 そのうち Windows の方がデフォルトで UTF-8 を使うようになれば、Mac ZIP の問題も解消されるでしょう。
本記事のバッチは Windows 10 と Windows 11 で動作確認しました。
不具合や要望がありましたら下のコメント欄か Twitter にてお知らせください。
参考資料
- Compress-Archive (Microsoft.PowerShell.Archive) - PowerShell | Microsoft Learn
- ZipFile.CreateFromDirectory メソッド (System.IO.Compression) | Microsoft Learn
- https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
- ZIPの仕様を日本語でまとめる · GitHub
- ZIP中のファイル名の文字化け - tmtms のメモ
- Windows エクスプローラー、7-Zip でファイル名を UTF-8 エンコードした ZIP ファイルを文字化けせずに解凍するためには ZIP ファイル内で EFS が有効にされている必要がある? - Qiita
関連記事
更新履歴
- [2023/05/02] 公開
- [2023/05/02] 画像修正