我无法将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 /é.jpg” />给出Apache错误:
File does not exist: […]/upload/\xc3\xa9.jpg.
什么是正确的解决方案?如果我在Windows中重命名文件(é.jpg),则编码的HTML URI(é.jpg)会按预期工作.
此主题的某些信息:http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
解决方法:
将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上的其他信息:
> Character Sets Used in File Names(请参阅:Code Pages)
> File and Directory Names(命名约定)