如何在PHP中编码多字节文件名并在javascript中解码它们?

时间:2012-04-05 15:00:05

标签: php javascript encoding

以下是文件名的一些示例:

漢語.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);
}

我想这是关于编码的事情,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

所以,主要的是大多数传输(网络,文件,rpc)都需要最多一个字节的字符。 URL编码(%FF)期望输入数据也是每个字符的字节。

所以你需要做的是使用UTF8。它将采用多字节字符并从中生成一个1字节字符的字符串。从这个字符串开始,你可以做正常的事情。

你想要做的是为php明确设置编码:

mb_internal_encoding("UTF-8");

现在所有内部字符串和文件名等都将采用UTF-8(单字节)编码。 从这里你可以回显文件名AS-IS,它将作为编码数据到达传输。从javascript,您所要做的就是使用AJAX发送请求,它将自动为您自动解码,随时可以在浏览器中使用:)只需确保在您的html文件中设置内容类型,因为这将用作您的默认JS编码。

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />