UTF-8との互換性を維持しながら、エンコードが不明なアップロードされたファイル名をWindows-1252に変換する必要があります。
これらのファイルをコントローラー(影響力はありません)に渡すとき、ファイルはWindows-1252でエンコードされている必要があります。次に、このコントローラーは、MySQLを介してデータベースに保存される有効なファイル(名前)のリストを再度生成します。したがって、UTF-8との互換性が必要です。コントローラに渡されるファイル名とデータベースに書き込まれるファイル名は一致する必要があります。ここまでは順調ですね。
まれに、「Windows-1252」に変換する場合(文字「ï」など)、UTF-8では文字が無効なものに変換されます。次に、MySQLはそれらの無効な文字を削除します。その結果、ディスク上のファイル名とデータベースに保存されているファイル名は一致しなくなります。時々失敗するこの変換は、単純な再コーディングで達成されます。
$sEncoding = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//IGNORE", $sOriginalFilename);
変換によって無効な文字が生成されるのを防ぐために、再コード化された文字列からすべての無効なUTF-8文字を再度削除できます。
ini_set('mbstring.substitute_character', "none");
$sEncoding = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//TRANSLIT", $sOriginalFilename);
$sTargetFilename = mb_convert_encoding($sTargetFilename, 'UTF-8', 'Windows-1252');
ただし、これにより、文字列に残っている特殊文字が完全に削除/再コード化されます。たとえば、ドイツ語ではかなり規則的な「äöüÄÖÜ」などをすべて失います。
(有効な特殊文字を失うことなく)Windows-1252にエンコードするためのよりクリーンで簡単な方法をご存知の場合は、お知らせください。
どんな助けでも大歓迎です。前もって感謝します!