OSによってファイル名の正規化が行われる.
Linux / Windows
NFC: Normalization Form Canonical Compression
OS X
NFD: Normalization Form Canonical Decompression
異なる「正規化」間で問題となる.
PHPで認識して変換できるのか.
ファイルを OSX上でつくる.
$ ls KONBU.txt こんふ.txt こんぶ.txt
これに対してPHPコード.
<?php $files = glob('*.txt'); foreach ($files as $key => $file) { $raw = pathinfo($file, PATHINFO_FILENAME); $nfc_iconv = iconv('UTF-8-MAC', 'UTF-8', $raw); //$nfc_normalizer = Normalizer::normalize($raw, Normalizer::FORM_C); echo $raw . "\t" . mb_strlen($raw, 'UTF-8') . "\t" . //mb_strlen($raw, 'UTF-8-MAC') . "\t" . iconv_strlen($raw, 'UTF-8-MAC') . "\t" . urlencode($raw) . "\n"; echo $nfc_iconv . "\t" . mb_strlen($nfc_iconv, 'UTF-8') . "\t" . iconv_strlen($nfc_iconv, 'UTF-8-MAC') . "\t" . urlencode($nfc_iconv) . "\n"; //echo $nfc_normalizer . "\n"; }
実行.
$ php test.php KONBU 5 5 KONBU KONBU 5 5 KONBU こんふ 3 3 %E3%81%93%E3%82%93%E3%81%B5 こんふ 3 3 %E3%81%93%E3%82%93%E3%81%B5 こんぶ 4 3 %E3%81%93%E3%82%93%E3%81%B5%E3%82%99 こんぶ 3 3 %E3%81%93%E3%82%93%E3%81%B6
よって, NFDからNFCに変換する場合.
iconv('UTF-8-MAC', 'UTF-8', $raw)
PHP関数 iconv*( ) は「UTF-8-MAC」を知っている.