php上传图片名称乱码,WordPress上传中文图片名称变乱码怎么办

在WordPress里上传中文图片乱码的问题在许多linux主机上已经不存在了,但windows主机、本地配置的wampserver依然会有这个问题。解决方案,简单来说就是安装插件

上传中文名称的图片为何不显示

我在本地wampserver上搭建了WordPress来测试这个问题。从媒体库里上传一种名为图片.jpg的文件,从下面截图看出,上传后文件名称是正确的,也就是存到数据库的名称没错,但传到uploads文件夹下的图片名称是乱码。

4fdd33ccc090105659f54e2c8370934a.png

5c14ecf76177e667750fea0dc0fce08a.png

通过读代码可以发现,错误是在php拷贝文件时产生的,当php调用move_uploaded_file函数将上传文件从临时目录拷贝到目标目录时,会有一个编码转换的过程,网页传送数据以UTF-8编码,但windows系统却是别的编码,例如我的系统是GB2312编码,文件名从UTF-8转成其它编码时,乱码问题就产生了。

解决方案

知道了是编码问题,就有两种解决方案:像文章开头提到的插件一样,检测到非英语语言,就把文件重命名,直接规避了编码转换问题。

修改wordpress上传代码,调用move_uploaded_file函数前将文件名编码从UTF-8转换成主机系统的编码,利用iconv这个转码函数,这个方法是网上最流行的,但需要修改核心代码,而且还会导致缩略图无法创建。

我想详细说一下第二种方法,如果你搜索“wordpress上传中文图片乱码”,大概会得到这样的方案:找到wp-admin/includes/file.php,将$new_file = $uploads['path'] . "/$filename";

改为$new_file = $uploads['path'] . "/" . iconv("UTF-8","GB2312",$filename);

再将此函数结尾的return改为return apply_filters( 'wp_handle_upload', array( 'file' => $uploads['path'] . "/$filename", 'url' => $url, 'type' => $type ) , 'upload');

思路就是拷贝图片前将图片名称转为GB2312编码,return时则返回默认UTF8编码的名称,存到数据库里。

这会产生一些问题:防止图片重名的功能失效,wp_unique_filename函数不能正确检测图片是否重名,当这个函数调用file_exists("…/2017/04/图片.jpg")去检查图片.jpg是否存在时,得到的结果是不存在。程序不会说谎,图片.jpg确实不存在。将“图片.jpg”转为gb2312编码,看起来是“����222.jpg”这个样子,再调用file_exists("…/2017/04/����222.jpg")去检查,才能得到文件存在的结果。

图片缩略图无法创建,和上面的原因一样,创建缩略图时也调用数据库存储的utf-8格式的图片路径,找不到真实图片。像getimagesize这种函数都会得到错误的结果。

基于以上原因,建议不要使用第二种方法,维护起来很有难度。

关于主机编码

主机编码跟当前系统语言有关,具体是什么我们可以这样查看。

打开windows命令行工具,运行chcp命令,会显示活动代码页,代码页是字符编码的别名,我的是936,即GB2312。

47042846b21a56bb0c7f49469ebc7965.png

活动代码页对应的编码可以在这里查看,UTF-8对应65001。

要修改windows系统的默认区域,打开控制面板 > 区域 > 管理 > 更改系统区域设置

7dfafe444e4d91c48272db8b661d6d04.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值