2012-04-05 40 views
10

下面是文件名的一些示例:如何在PHP中对多字节文件名进行编码并在JavaScript中对它们进行解码?

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

我想这是一些关于编码,但我不知道该怎么办。

+0

mb_detect_encoding()不是无所不知的,并且会经常失败,这是因为几乎不可能确定一段文本使用什么编码。 – 2012-04-05 15:05:12

回答

1

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

所以你需要做的就是利用UTF8。它将采用多字节字符并将1个字节的字符串从中取出。从这个字符串中,你可以通常做ascii可以做的事情。

你想要做什么明确设置编码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″ /> 
+0

如果我使用'mb_internal_encoding(“UTF-8”);'在代码上仍然出现错误的编码'rawurlencode(mb_convert_encoding($ file [0],“UTF-8”));'(例如仍然俄语字符编码为%3F(?)) – ahk 2012-04-06 08:00:25

+0

你不应该使用mb_convert_encoding($ file [0],“UTF-8”),或者甚至rawurlencoding如果你只是回显数据(php会使所有字符串默认为UTF-8 – 2012-04-06 13:53:08

+0

I没有使用它们,但我得到了奇怪的字符,当我只是呼应文件名。Html文件编码是UTF-8没有bom和内容类型也是utf-8只有我找到的解决方案是上面的:'rawurlencode(mb_convert_encoding($文件,“UTF-8”,“ISO-8859-9”))'但这只适用于土耳其文字符,因为“ISO-8859-9”是针对土耳其语的:http://en.wikipedia.org/wiki/ ISO/IEC_8859-9 – ahk 2012-04-06 15:50:16

相关问题