我需要将上传的文件名与未知编码转换为Windows-1252,同时保持UTF-8兼容性。PHP编码转换为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(不丢失有效的特殊字符),请让我知道。
任何帮助非常感谢。先谢谢你!