Mac ファイル名の濁点が分離してWindowsで文字化け? USB経由の直し方
Mac ファイル名の濁点が分離してWindowsで「か゛」「ハ゜」のように見える場合、ファイル自体もUSBメモリも壊れていません。原因はファイル名の文字の「表し方」の違いです。Macは濁点や半濁点を仮名と別の文字として保存する形式(NFD)で名前を書き出すことが多く、Windowsは濁点込みで1文字として扱う形式(NFC)を前提にしています。韓国語の名前はハングルの字母がバラバラになり、JoséやZoëのようなアクセント付きの名前は見た目は正常でも検索でヒットしなくなります。直し方は、Windows側でPowerShellを数行実行するか、Mac側で短いPythonスクリプトを実行するか、ブラウザで動くFilenameFixerのようなツールにファイルを放り込むかの3通りです。順番に説明します。
USBメモリ経由でMacのファイル名の濁点が分離する理由
MacとWindowsの両方で読み書きできるUSBメモリや外付けHDDは、たいていexFATかFAT32でフォーマットされています。どちらのファイルシステムも、受け取ったファイル名をそのまま保存するだけで、文字を書き換えることはありません。問題はまさにそこで、macOSとWindowsは「同じ見た目の名前」を違う文字の並びで渡しているのです。
Unicodeでは、多くの文字に2種類の書き方があります。
- 合成形(NFC): 「が」は1文字。「é」も1文字。「가」も1文字。
- 分解形(NFD): 「が」は「か」+「結合用の濁点」の2文字。「é」は「e」+「結合用アクセント」。「가」は子音「ㄱ」+母音「ㅏ」。
Finderでファイル名を付けたり、Macのアプリから保存したりすると、macOSは分解形(NFD)で名前を書き出すことがよくあります。一方、Windows、Webフォーム、ほとんどのサーバーは合成形(NFC)を期待しています。USBメモリがWindows PCに刺さると、エクスプローラーは受け取った並びをそのまま表示するので、こうなります。
請求書_データ.xlsxが請求書_テ゛ータ.xlsxになり、濁点が仮名の横に浮いて見える。ポートフォリオ.zipがホ゜ートフォリオ.zipになる。- 韓国の取引先からの
보고서.docxがㅂㅗㄱㅗㅅㅓ.docxのように字母ごとに分かれる。 José_contract.pdfは見た目は普通でも、エクスプローラーの検索欄にJoséと入力しても見つからず、一部のソフトでは開けない、取り込めない。
ファイルの中身は1バイトも壊れていません。ファイル名の「綴り」が、Windowsが同じ名前だと認識できない形になっているだけです。
よくあるUSBメモリのトラブル(NTFSだからMacで書き込めない、FAT32だから4GB超のファイルがコピーできない)とは別の話です。コピーも開くこともできるのに名前だけおかしい、という場合は、フォーマットではなく正規化(ノーマライズ)の問題です。
まず確認: 本当に正規化の問題か
リネームする前に原因を確かめておきましょう。Windows PCでUSBメモリ内のフォルダーを開き、PowerShellで次を実行します。
Get-ChildItem -File | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
Length = $_.Name.Length
NFC = $_.Name.Normalize([Text.NormalizationForm]::FormC).Length
}
}
Length 列が NFC 列より大きいファイルは、名前に分解形の文字が含まれています。たとえば 請求書_データ.xlsx なら、保存されている長さは13、NFCに直すと12と表示されます。5音節の韓国語名なら12以上になることもあります。2つの数字が同じ行はすでに問題がなく、触る必要はありません。
Windows側で直す(無料、インストール不要)
USBメモリがすでに相手の手元にあり、相手がWindowsを使っているなら、これがいちばん現実的です。作業はすべてUSBメモリの中で完結し、Macは一切関係ありません。
- USBメモリを挿し、エクスプローラーでそのフォルダーを開きます。
- アドレスバーをクリックして
powershellと入力し、Enterを押します。そのフォルダーを開いた状態でPowerShellのウィンドウが開きます。 - 次を貼り付けてEnterを押します。
Get-ChildItem -Recurse |
Sort-Object { $_.FullName.Length } -Descending |
ForEach-Object {
$nfc = $_.Name.Normalize([Text.NormalizationForm]::FormC)
if ($nfc -ne $_.Name) {
Rename-Item -LiteralPath $_.FullName -NewName $nfc
Write-Host "renamed: $nfc"
}
}
やっていることは、ドライブ内のすべてのファイルとフォルダーを深い階層から順にたどり(フォルダーの中身を先に直してからフォルダー自体を直すため)、それぞれの名前をNFCに変換し、変換前後で名前が変わる場合だけリネームする、というものです。すでに合成形の名前には触りません。-LiteralPath を付けているのは、壊れた名前の中にPowerShellがワイルドカードと解釈してしまう文字が含まれることがあるためです。
- エクスプローラーでF5を押します。濁点や半濁点が仮名にくっつき、ハングルも正しく表示され、
Joséで検索してもヒットするはずです。
知っておきたい制限:
- 同じフォルダーにNFD版とNFC版の同名ファイルが両方ある場合、その組はリネームに失敗し「すでに存在します」というエラーになります。どちらを残すか手動で判断してください。
- 別のソフトで開いているファイルはリネームできません。Word、Excel、Photoshopなどを先に閉じてください。
- これで直るのはUSBメモリ上のコピーだけです。Mac側の元ファイルは分解形のままなので、次に渡すときにまた同じことが起きます。根本から直すなら、Mac側で対処が必要です。
Mac側で、渡す前に直しておく
自分がMacユーザーで、USBメモリでの納品や受け渡しが頻繁にあるなら、ドライブが手元を離れる前に直しておくほうが確実です。Finderにはこのための設定はありませんが、Pythonを数行書けば済みます。Python 3はXcodeコマンドラインツールに含まれており、ターミナルで python3 --version を実行してバージョン番号が出れば使えます。
- いつもどおりUSBメモリにファイルをコピーします。
- ターミナルを開き、
MYDRIVEの部分をデスクトップに表示されるドライブ名に置き換えて次を実行します。
python3 - <<'EOF'
import os, unicodedata
root_dir = '/Volumes/MYDRIVE'
for root, dirs, files in os.walk(root_dir, topdown=False):
for name in files + dirs:
fixed = unicodedata.normalize('NFC', name)
if fixed != name:
os.rename(os.path.join(root, name), os.path.join(root, fixed))
print('renamed:', fixed)
EOF
- ドライブを取り出し、可能ならWindows PCで確認します。表示も検索も正常になっているはずです。
2点だけ補足します。まず、このスクリプトが変えるのは内部の文字の並びだけなので、Mac上では実行前後で名前の見た目はまったく変わりません。これは正常です。次に、NFCに直したファイルをその後Macのアプリで編集して同じ名前で上書き保存すると、アプリによっては再び分解形で書き出すことがあります。何日も前ではなく、渡す直前にスクリプトを実行するようにしてください。
ターミナルを使いたくない場合
FilenameFixer は、同じ変換をブラウザ上で行う無料ツールです。USBメモリからファイルをページにドラッグ&ドロップすると、NFDからNFCへまとめてリネームされます。ファイルとファイル名はブラウザ内でローカルに処理され、サーバーにはアップロードされません。日本語の濁点・半濁点の分離、韓国語の字母分解、ラテン文字のアクセント分離のいずれにも対応しており、Chrome、Edge、Safari、Firefoxのどれでも、MacでもWindowsでも使えます。
納品物がバラのファイルではなく1つのZIPアーカイブの場合、ZIPの中にも分解形の名前がそのまま入っているため、Windowsで解凍すると壊れた名前で展開されます。ZIPファイル名復元ツール はアーカイブ内のファイル名を書き換える(200MBまで)ので、受け取る側は何も実行せずに、解凍するだけで正しい名前になります。
次の受け渡しで繰り返さないために
送る側でも受け取る側でも、いくつかの習慣で問題はなくなります。
- 納品ファイルの命名ルールを決めておく。 会計ソフト、CMS、写真管理ソフトなど別のシステムに取り込むファイルは、
seikyusho-2026-10.pdfのような半角英数字の名前にしておくと、正規化の問題もその他の文字コードのトラブルもまとめて避けられます。日本語や韓国語、アクセント付きの読みやすい名前は、文書の中や送付状に書いておけば十分です。 - 取り出す直前に正規化する。 編集をすべて終えた最後の工程として、Pythonスクリプトを実行するかブラウザツールにフォルダーを放り込みます。
- Windows側に確認用スクリプトを置いておく。 上の長さ比較のスニペットは数秒で終わります。Macから来たドライブを修正すべきかどうか、誰かがシステムへの取り込みで無言のエラーに悩む前に判断できます。
- フォーマットし直しても解決しない。 NTFS、exFAT、FAT32のどれも名前を受け取ったまま保存します。正規化はフォーマットでは変わらず、リネームでしか直りません。
名前が合成形になっていれば、Windowsの検索でヒットし、取り込みも成功し、相手が「か゛くせい」や「ㅎㅏㄴㄱㅡㄹ」と向き合わされることもなくなります。