OSXでUSBメモリ上のNFDファイル名のファイルへアクセス不能
はじめに
USB メモリ (FAT32) 上に Windows 上で作成した Unicode の NFD のファイル名を持つファイルは、OSX からはアクセスできません*1。以下では現象の説明と原因の推測を行います。
発端
Windows 用の iTunes は、少なくとも v7.0.2 のころは My Music\iTunes\iTunes Music\ 以下のファイルのファイル名を NFD で保存するようになっていたようです。
つまり、
ダ.m4a
というファイルが存在する場合、そのファイル名の Unicode は
U+30bf(タ) U+3099(゛) U+002e(.) U+006d(m) U+0034(4) U+0061(a)
となります。
このファイルを Explorer で名前変更しようとすると、「ダ」のところでカーソルが 2 つ動きますし、「ダ」の後ろで Back Space を押すと「タ」へ文字が変わるという挙動を見せます。
このファイルを FAT32 でフォーマットされた USB メモリへコピーし、OSX で開こうとしたところ、 Finder や ls でファイル名をリストアップすることはできるものの、ファイルを読み取ることはできませんでした。ファイルサイズすら不明です。
逆に OSX → Windows では?
OSX 側で「ダ.m4a」というファイルを USB メモリ (FAT32) 上に作成し、Windows で開く場合は問題なく動作します。ファイル名は、
U+30c0(ダ) U+002e(.) U+006d(m) U+0034(4) U+0061(a)
であり、NFC となっています。
推測
以下は推測ですが、OSX では FAT32 へアクセスするときにファイル名を変更するんだと思います*2。
ここでポイントとなるのは、元々ファイル名が NFD で保存されている場合は readdir() 時の NFC → NFD 変換の影響をうけず、あいかわらず NFD のままだということです。
それなのに、open() するときに NFD → NFC 変換が行われるせいで、そんなファイルは見つからないということになります。
まとめ
OSX とファイルを交換する場合、FAT32 上で NFD なファイル名をもつファイルを作成してはいけません。また、OSX がファイル名を NFD で取り扱うという性質上この問題は将来的にも解決される見込みはないと思われます。
Windows 上で NFD で作成したファイルをどうしても FAT32 経由で OSX へコピーする必要がある場合、以下のような作業が必要になります。
*1:調査は Windows XP と Snow Leopard で行いました