php-如何存储具有非ASCII文件名的上传文件?

我无法将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(命名约定)

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...