我需要将上传的具有未知编码的文件名转换为 Windows-1252,同时还要保持 UTF-8 兼容性。
当我将这些文件传递给控制器(我对其没有任何影响)时,这些文件必须是 Windows-1252 编码的。然后,该控制器再次生成通过 MySQL 存储到数据库中的有效文件(名称)列表 - 因此我需要 UTF-8 兼容性。传递给控制器的文件名和写入数据库的文件名必须匹配。到目前为止,一切都很好。
在极少数情况下,当转换为“Windows-1252”时(例如使用 te 字符“ï”),该字符会转换为 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 的方法(不会丢失有效的特殊字符),请告诉我。
非常感谢任何帮助。先感谢您!