2010年5月16日

Mac OS X におけるファイル名に関するメモ(NFC, NFD等)

Mac OS X で ファイルシステムのフォーマットに HFS+ を利用している場合、ファイル名の取り扱いが、 Windows や Linux と異なります。

具体的には濁点や半濁点の扱いが異なります。これは Unicode の正規化に関係しています。

「Unicode の正規化」とは簡単に言うと、どの文字を同じ文字として処理するか、という問題への対処で、「が」を「が」として扱うか「か + ゛」として扱うか、ということです。 「Unicode の正規化」を実施することで「が」で入力されても、「か + ゛」で入力されても、どちらか一方に統一して、同じ文字として扱えるようにします。

こうした正規化形式には4種類存在します。

  • Normalization Form D(正規化形式 D, NFD)
  • Normalization Form C(正規化形式 C, NFC)
  • Normalization Form KD(正規化形式 KD, NFKD)
  • Normalization Form KC(正規化形式 KC, NFKC)

D が Decomposition(分解)、C が Composition(合成)、KがCompatibility(互換性) を意味するようです。つまり NFC が文字を合成側に正規化し、NFD が文字を分解側に正規化します。

Windows や Linux は NFC で正規化されていると考えらますが、動作的には積極的に正規化した結果で NFC になっているのではなくて、合成済みの文字のみしか扱かわないので偶然 NFC になっているように見えます。

Mac の場合は積極的にファイル名に NFD を利用して正規化を実施します。ただし Mac の 正規化は NFD と同じではないため、単純ではありません。NFD の仕様で正規化対象になるべき文字の一部が正規化対象になっていません。

その結果 Mac のファイル名の正規化関しては「UTF-8-MAC」(iconv)や「UTF-8-HFS」(Emacs)等の呼称で扱われています。

ファイル名の正規化は様々な問題を引き起しますが、各アプリケーションで対応されていたりいなかったりします。

Samba は対応されていますが、 PHP や Subversion 等は標準では NFD に対応していません。

Subversion 等のバージョン管理システムを利用して共同作業を実施すると、濁点半濁点を含むファイル名が存在すると別のファイルとして管理されてしまいます。一番簡単なのは処理する時に一時的に NFC にしてしまうことのようです。

MacPorts を利用している場合は、以下のようにインストールするとパッチがあたった Subversion がインストールされます。

port install subversion +unicode_path

Emacs は 23.2 から「ucs-normalize.el」という Mac のファイル名正規化等を扱うためのプログラムが追加されたため、以下のような設定をすることで対応可能です。

(require 'ucs-normalize)
(setq file-name-coding-system 'utf-8-hfs)
(setq locale-coding-system 'utf-8-hfs)

PHP などで作成されたアプリケーションは独自で対応するしかまだ方法がないようです。

今後改善されるかは不明です。

参考資料