以下是一些文件名的示例:
漢語.jpg (Chinese)
Федерация.jpg (Russian)
AbÇöişÜĞ.jpg (Turkish, ISO-8859-9)
...
我尝试了rawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file)))
,但这并不起作用,所有的中文和俄语字符都被打印成了%3F(普通问号),所有土耳其字符都被删除。
我在Windows、PHP 5.3上测试。
我找到的唯一解决方案是显式输入编码:rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9"))
,这仅对土耳其字符有效。
顺便说一下,对于以上文件,mb_detect_encoding($file)
始终返回"UTF-8"。
编辑:
运行下面的代码后,我认为mb_convert_encoding()
无法解决我的问题:
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS));
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH);
foreach ($iterator as $file)
{
foreach (mb_list_encodings() as $encoding)
var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding);
}
我猜这可能与编码有关,但我不知道该怎么做。