PHP+MySQL网站中关于上传中文文件名照片乱码问题的探讨
2017-09-15
(衡阳技师学院 湖南 衡南 421101)
PHP+MySQL网站中关于上传中文文件名照片乱码问题的探讨
李彩云
(衡阳技师学院湖南衡南421101)
PHP+MySQL网站中上传、缩放、显示含中文文件名照片时乱码问题的解决方法。
PHP+MySQL网站;中文文件名照片;上传;缩放;显示;乱码;解决
做网站的朋友,做信息处理系统的朋友,在做之前大抵都会思考一个基础性问题,选用什么字符集。笔者近期使用PHP+Mysql在做一个B/S的信息处理系统,页面使用utf-8字符集,后台mysql数据库使用的也是utf8字符集,操作系统是gbk字符集,用户在上传并缩放含中文命名的照片文件到系统时,总是存在乱码问题,下面是笔者对这一问题的一些不成熟的解决方法,总结出来,以期抛砖引玉。
一、关于网站和mysql数据库常用中文字符集
据统计当前主流网站使用的字符集主要有utf-8和gb2312,下表是统计结果。
各网站所用字符集
从这个统计可以看出,当前主流中文网站很多都使用gb2312字符集,它们或许是早期设计时考虑gb2312编码更方便吧。
而使用过mysql数据库的朋友都清楚,它的字符集很丰富,存储处理中文为主的信息时,我们一般选择gb2312或utf8,而使用繁体字的台湾地区可使用big5。Gb2312存储一个中文汉字占两个字节,而utf8存储一个中文汉字要三个字节。mysql服务器默认使用latin1字符集,这是支持西欧语系的,我们中国人一般会设置为utf8或gb2312,当主要是处理中文信息时,采用gb2312可节省存储空间,帮数据库瘦身。
二、在上传缩放含中文文件名的照片时,字符集不一致导致的问题及解决方法
1.页面使用gb2312,后台mysql数据库使用gb2312字符集,GBK的操作系统
页面、后台mysl数据库如果都用gb2312,我们的操作系统是gbk,则不管是照片上传到服务器的文件系统中,还是存储到数据库中都不会出现乱码问题,再从数据库中调回到页面也不会出现不显示的问题,正是皆大欢喜呀!
A、从gb2312的页面上传照片到gbk的服务器上
move_uploaded_file(myphoto['tmp_name'],fpath);
B、在gb2312页面缩放照片文件
pinfo=getimagesize(fpath);//取得照片文件的尺寸信息
src=imagecreatefromjpeg(fpath);//取得照片文件的图像资源
imagejpeg(dst,fname);//将取出的图像资源输出到文件
C、将包含照片信息的记录存储到数据库的表中,输出到gb2312的页面,都不需转换。
insstr=“insert into xs set学号='stuNumber',姓名='stuName',照片='fname'”;
res=mysqli_query(link,insstr);//将包含照片文件信息的记录插入到数据库的表中。
2.页面使用utf-8,后台mysql数据库使用utf8字符集,GBK的操作系统
页面使用utf-8、数据库使用utf8、数据库连接使用utf8、操作系统是GBK,使用PHP语言上传并缩放含中文名称的照片后,存放到服务器的文件夹中,显示的照片文件名是乱码,数据库中存储的路径没问题,但在页面浏览数据时,照片不能正常显示。页面使用utf-8,数据库和连接使用utf8,是标配,理应没问题的,但因为我们使用中文操作系统,文件系统的字符集是GBK,还是存在字符集不一致的问题,所以只要与文件系统有数据传输,就会出问题。
要解决这一问题,可以使用PHP中的iconv()函数,该函数能将字符串或文件由一种字符集转化为另一种字符集。如iconv(“gb2312”,”utf-8”,str)的功能是将字符串str的字符集由gb2312转化为utf-8。
A、上传照片文件时,加iconv()函数,使它的字符集由utf-8转化为gb2312,上传到服务器文件夹中时,中文文件名的照片文件的文件名不会出现乱码。
move_uploaded_file(myphoto['tmp_name'],iconv(“utf-8”,“gb2312”,fpath));
B、缩放照片时,凡是用到照片文件的都使用iconv()函数转换,将从文件系统导出的gb2312数据流与页面的使用的字符集utf-8不冲突。
pinfo=getimagesize(iconv(“utf-8”,“gb2312”,fpath));//取得照片文件的尺寸信息
src=imagecreatefromjpeg(iconv(“utf-8”,“gb2312”,fpath));//取得照片文件的图像信息
imagejpeg(dst,iconv(“utf-8”,“gb2312”,fname));//将取出的图像资源输出到文件
C、将包含照片信息的记录存储到utf8的数据库的表中,输出到utf-8的页面,与gb2312字符集一样,都不需转换。
而如果页面、连接都使用uft8,数据库使用gb2312,操作系统是GBK,上传并缩放含中文名称的照片后,存储到数据库的表中时要将utf-8转换为gb2312,输出到页面时,又要将gb2312转换成utf-8。
sinfo['照片']);?>”>//将包含照片信息的记录在utf-8的页面显示。
综上所述,不管页面、数据库使用什么字符集,在上传、缩放、存储、显示含中文文件名的照片到数据库、到页面时,如果有乱码问题,我们都可以考虑使用PHP提供的iconv()进行转换这种方法来解决。
[1]郑阿奇主编.MySQL实用教程.电子工业出版社.2017年7月.
[2]唐俊主编.PHP+MySQL网站开发技术项目式教程.人民邮电出版社.2015年7月.