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つ)として保存されます。

"e" = U+00E9(1 code point)

NFD(分解形式)

文字が基底文字と結合文字に分解されます。同じ「が」がU+304B(か)+ U+3099(結合濁点)の2つになります。

"e" + " ́" = U+0065 + U+0301(2 code points)

どちらの形式も画面上では同じに見えますが、メモリ上の保存方法が異なります。この違いがファイル名の文字化けの根本原因です。

なぜ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に変換します。変換はすべてブラウザ内で行われ、ファイルがサーバーに送信されることはありません。ファイルの内容はまったく変わらず、ファイル名だけが変更されます。

なぜブラウザで処理する?

ブラウザでファイルを処理するということは、データがデバイスから出ないということです。信頼するサーバーも不要で、プライバシーポリシーの心配もなく、データ漏洩のリスクもありません。オフラインでも使用でき、処理速度も非常に高速です。