我需要將上傳的文件名與未知編碼轉換爲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(不丟失有效的特殊字符),請讓我知道。
任何幫助非常感謝。先謝謝你!