ウノウラボに「Mac OS X上のUnicode」を書いたのが、もう9年も前。相変わらずMacの日本語ファイル名はNFDで正規化されたUnicodeで、そのままだとPHPのmbstringなどで扱えない。濁点、半濁点が含まれる文字列が途中で切れてしまったりする。
当時書いた記事では次のように「PHP6が待ち遠しい」と書いたが、結局PHP 6は出ずにPHP 5.3にバックポートされたのはご存知の通り。
ICUを使った正規化ライブラリが存在するようなので、 ICUベースでUnicode対応する予定のPHP6が待ち遠しいところです。
PHP 5.3からICUのライブラリを使ったNormalizerクラスが組み込まれたので、それを使えばPHPで簡単に正規化し直せるようになった。
if (Normalizer::isNormalized($input, Normalizer::FORM_D)) {
$input = Normalizer::normalize($input, Normalizer::FORM_C);
}
ちなみにNormalizer::FORM_C
の代わりにNormalizer::NFC
、Normalizer::FORM_D
の代わりにNormalizer::NFD
でも定数が定義されているので使える模様(マニュアルには記載なし)。