OSによってファイル名の正規化が行われる.
Unicode正規化 - Wikipedia
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」を知っている.