php上传中文文件名乱码问题的解决方案
上传php文件是最基本的技术点,但深入其中仍有很多问题需要解决。事实并非如此。上传中文文件后,文件名变得乱码。
下面是问题代码,非常简单:
1.问题代码。
Html部分:
复制的代码如下: html body formaction=' upload _ file . PHP '方法=' post ' enctype=' multipart/form-data '标签为=' file ' filename 3360/labelinput type=' file ' name=' file ' id=' file '/br/输入类型=' Submit ' name=' Submit ' value=' Submit '/form/body/html
php第:部分的复制代码如下。phpif($ _ FILES[' FIle '][' error ']0){ echo ' Return code : '。$_FILES['file']['error']。br/';}else{ echo 'Upload: '。$_FILES['file']['name']。br/';回应“类型:”。$_FILES['file']['type']。br/';回显“Size:”。($_FILES['file']['size']/1024)。kbbr/';回显“临时文件:”。$_FILES['file']['tmp_name']。br/';if (file_exists('upload/')。$ _ FILES[' file '][' name ']){ echo $ _ FILES[' file '][' name ']。'已经存在';} else { move _ uploaded _ file($ _ FILES[' file '][' tmp _ name '],' upload/')。$ _ FILES[' FIle '][' name ']);}}
上传了一个名为“测试数据”的文件。txt ",哦嚯,文件上传了,但是文件名乱码了。
2.初始测试
网上搜索解决方案,放进去。
复制代码如下: move _ uploaded _ file($ _ files[' file '][' tmp _ name '],' upload/'。$ _ files[' file '][' name ']);
换成
复制代码如下: move _ uploaded _ file($ _ files[' file '][' tmp _ name '],' upload/'。iconv ('utf-8 ',' gbk ',$ _ files[' file '][' name ']);
结果表明iconv函数的返回值为假。
查阅功能手册,发现第二个参数有特殊用法。简单翻译一下,我可以在代码后面追加///TRANSLIT或者//IGNORE。前者会将不可翻译的字符变成最接近的字符,而后者会直接忽略不可翻译的字符。
试试看:
复制代码如下:var _ dump (iconv ('utf-8 ',' gbk//translate ',$ _ files[' file '][' name ']);var_dump(iconv('UTF-8 ',' gbk//IGNORE ',$ _ FILES[' file '][' name ']);
结果:
bool(false)字符串(4)”。' txt '
也就是说,中文不能转换,甚至没有紧密相连的字符。看来网上介绍不是万能的。
3.网上介绍方法失败,再试一次。
你猜,也许我的系统在创建中文文件时会乱码,所以我重写了代码:
复制代码如下: move _ uploaded _ file($ _ files[' file '][' tmp _ name '],' upload/test data . txt ');
结果创建成功,没有乱码字符。也就是说,不是制度问题。
想想看,我的php文件本身是utf8编码的。
复制代码如下: move _ uploaded _ file($ _ files[' file '][' tmp _ name '],' upload/test data . txt ');
这个语句必须使用utf8编码,那么上传的文件名肯定不是utf8编码,所以下面的语句肯定是错误的,因为源字符串本身不是utf8编码:
复制代码如下: iconv ('utf-8 ',' gbk//translation ',$ _ files[' file '][' name ']);
使用函数检查源字符串的编码:
复制代码如下: $ e=MB _ detect _ encoding($ text,array ('utf-8 ',' gbk ',' GB 2312 ');echo $ e;
结果是CP936,也就是说,源字符串代码是GBK。
尝试
复制代码如下: move _ uploaded _ file($ _ files[' file '][' tmp _ name '],' upload/'。iconv ('gbk ',' utf-8 ',$ _ files[' file '][' name ']);
解决问题,不再乱码。
4.另一个解决方案。
事实上,还有另一种解决方案,那就是在html文档的头部标签中间添加。
复制代码如下: meta http-equiv=' content-type ' content=' text/html;charset=utf-8 /
使得编码统一,不需要转码。
5.以下是结论。
使用iconv功能可以解决上传中文文件名乱码的问题。实际上,iconv可以解决编码不一致带来的各种乱码问题。使用iconv函数首先检查源字符串的编码,除非您已经确定了源字符串的编码。尽量确保所有代码编码一致,并使用iconv功能作为最后手段。尽量不要用中文文件名作为保存在服务器上的文件名,请将文件名转换成自己的文件名(即使是英文文件名,也请转换一下)。
版权声明:php上传中文文件名乱码问题的解决方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。