MacとWindows間でファイル名が壊れる理由
Macから送ったファイルをWindows PCで開いたら、ファイル名が文字化けしていた経験はありませんか?アクセントが分離したり、ハングルがバラバラになったり。これはUnicodeのNFDとNFCの違いが原因です。
Unicodeとは?
Unicodeは、世界中のすべての文字を表現するための国際標準です。各文字に固有の番号(コードポイント)を割り当てます。例えば「A」はU+0041、「あ」はU+3042です。
NFC vs NFD:問題の根本原因
Unicodeでは、一部の文字を2つの方法で表現できます:
NFC(合成形式)
文字が1つのコードポイントとして保存されます。例えば「が」はU+304C(1つ)として保存されます。
NFD(分解形式)
文字が基底文字と結合文字に分解されます。同じ「が」がU+304B(か)+ U+3099(結合濁点)の2つになります。
どちらの形式も画面上では同じに見えますが、メモリ上の保存方法が異なります。この違いがファイル名の文字化けの根本原因です。
なぜmacOSはNFDを使うのか?
AppleはHFS+ファイルシステム(その後APFS)でNFDを選択しました。分解された形式が文字列の比較とソートを簡素化するためです。macOSがファイルを保存する際、ファイル名を自動的にNFDに変換します。一方、WindowsとLinuxは一般的にNFCを使用します。そのため、MacからWindowsにファイルを転送すると、ファイル名が正しく表示されないことがあります。
🇰🇷 韓国語:最も目立つケース
韓国語はこの問題が最も劇的に現れます。NFCでは「한」は1つの文字(U+D55C)です。NFDでは3つのジャモに分解されます:「ㅎ」+「ㅏ」+「ㄴ」。そのため「한글.txt」というファイル名がWindowsでは「ㅎㅏㄴㄱㅡㄹ.txt」と表示されます。
ㅎㅏㄴㄱㅡㄹ.txt한글.txt🇫🇷 フランス語:分離したアクセント
フランス語のアクセント付き文字(e, e, e, cなど)が影響を受けます。NFDでは「resume.pdf」が「r + e + 結合アクセント + sume + 結合アクセント.pdf」になります。一部のシステムでは似て見えることもありますが、ファイル検索やソートで問題が発生します。
résumé.pdfrésumé.pdf🇩🇪 ドイツ語:壊れたウムラウト
ドイツ語のウムラウト(o, u, a)がNFDで分解されます。「Uber.docx」が「U + 結合トレマ + ber.docx」になります。WindowsやLinuxユーザーとファイルを共有する際に問題が発生する可能性があります。
Über.docxÜber.docx🇻🇳 ベトナム語:複雑なダイアクリティカルマーク
ベトナム語は特に影響が大きく、文字に複数のダイアクリティカルマークが付くことが多いためです。「ệ」のような文字が「e + 結合サーカムフレックス + 結合下ドット」の3つのコードポイントに分解されることがあります。
Việt Nam.txtViệt Nam.txt🇪🇸 スペイン語:nの問題
スペイン語のn(エニェ)はU+00D1から「N」+ 結合チルダ(U+0303)に分解されます。アクセント付き母音(a, e, i, o, u)もすべて影響を受けます。
España.txtEspaña.txtこの問題はいつ発生する?
- MacからWindowsへメール添付ファイルを送信する時
- USBドライブでファイルを共有する時
- クラウドストレージにアップロードする時(Google Drive、Dropbox、OneDrive)
- ネットワークでファイルを転送する時(NAS、SMB共有)
- Macで作成したZIPファイルをWindowsで展開する時
- バージョン管理システムを使用する時(Git)
FilenameFixer はどう解決する?
FilenameFixer はJavaScriptのString.prototype.normalize()メソッドを使用して、ファイル名をNFDからNFCに変換します。変換はすべてブラウザ内で行われ、ファイルがサーバーに送信されることはありません。ファイルの内容はまったく変わらず、ファイル名だけが変更されます。
なぜブラウザで処理する?
ブラウザでファイルを処理するということは、データがデバイスから出ないということです。信頼するサーバーも不要で、プライバシーポリシーの心配もなく、データ漏洩のリスクもありません。オフラインでも使用でき、処理速度も非常に高速です。