下载名称中包含非ASCII字符的文件

时间:2013-02-07 21:36:12

标签: php html apache filenames

我的网站允许用户上传任何名称的文件。当然,有些名称将包含非ASCII字符。当用户上传文件时,我将其保存在原始名称的文件夹中。但是,当我尝试下载它时,通过访问它的位置(例如,files/Tolstoy - How much land does a man need?.pdf),我得到一个404.有没有办法解决这个问题,以便文件保留原始名称?通过Apache,也许?

3 个答案:

答案 0 :(得分:1)

嗯,只使用url编码,也称为percent encoding?这是为了处理网络中的网址。打印到HTML的所有网址都应该进行网址编码。

对于PHP,应使用rawurlencode,因为它应符合标准,urlencode不符合。{/ p>

编辑:针对此问题

  

PHP将“é”编码为“e%26%23769%3B”,而不是“e%CC%81”

对于e%CC%81

为UTF-8。 e%26%23769%3B将用于é,这是同一个HTML实体。这意味着您在urlencoding之前正在进行显式htmlentities()调用,或者您的服务器设置会自动执行此操作。如果有适当的字符集(实际上只需要htmlspecialchars调用),则不是严格需要的,但它也不应该破坏任何东西。

如果您想测试一些在线工具:

答案 1 :(得分:0)

解决方法:在上传时将文件名转换为ASCII。你会很高兴的。

答案 2 :(得分:0)

好吧,由于某种原因,我仍然不明白,使用rawurlencode()代替urlencode()使其有效。

然而,字符é(其中,我确定)仍然被奇怪地编码(e%26%23769%3B而不仅仅是%C3%A9)。更奇怪的是,包含它的链接起作用。