我无法将 UTF-8 文件名传递给move_uploaded_file()
,因为它按字节顺序转换,导致文件系统中出现错误名称。例如:
move_uploaded_file($_FILES['userfile']['tmp_name'], '\upload\é.jpg');
在上传目录中创建 xa9.jpg 。
虽然Windows API支持 UTF-16 ,但将此类文件名(例如iconv('UTF-8', 'UTF-16', 'é')
)传递给move_uploaded_file()
会导致错误。
百分比编码所有特殊字符是合理的,根据RFC 3986,我绝对应该对URI做同样的事情。但是当我使用百分比编码的URI时,Apache会给出404错误,因为它解码了URL并且找不到任何名称。
例如:<img src="/upload/%C3%A9.jpg" />
给出了Apache错误:
文件不存在:[...] /upload/\xc3\xa9.jpg。
什么是正确的解决方案?如果我在Windows中重命名该文件(é.jpg),编码的HTML URI(%C3%A9.jpg )将按预期工作。
有关此主题的一些信息:http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
答案 0 :(得分:3)
将iconv('UTF-8', 'Windows-1250', $_FILES['userfile']['name'])
传递给move_uploaded_file()
,而不是使用UTF-16 ,并将HTML的文件名保存为rawurlencode($_FILES['userfile']['name'])
。
如果此文件名存储在数据库中,则任何文件请求都应引用iconv('UTF-8', 'Windows-1250', rawurldecode($filename))
。
我使用Windows-1250字符集,因为这是我系统的默认设置。
有关MSDN的其他信息: