在WordPress里上传中文图片乱码的问题在许多linux主机上已经不存在了,但windows主机、本地配置的wampserver依然会有这个问题。解决方案,简单来说就是安装插件Clean Image Filenames,在文件上传之前检测文件名,发现是中文就重命名再上传。要具体了解,就继续看。

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

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

 

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

解决方案

知道了是编码问题,就有两种解决方案:

  1. 像文章开头提到的插件一样,检测到非英语语言,就把文件重命名,直接规避了编码转换问题。
  2. 修改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。

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

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

8条留言

  1. 您好,您的网站做的很不错,很漂亮,我已经收藏了,方便我随时访问.

  2. 哇,现在还能坚持写博客的人不多了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注