PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案

阐述

最近几天与公司的PHP开发人员测试即将上线的WEB站点(致难忘的青春岁月:http://hd.gfan.com),在内网测试环境没有任何问题,但在线上测试时,发现通过PHP的GD函数 imagefttext()引用FreeType字体将文本信息写入图像时,出现中文乱码;对此问题,我们在整个排查过程中,总结了三个能引起中文乱码的原因,如下:

1、Linux系统字符集是否支持中文?

[email protected]:~#locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
 
[email protected]:~#echo $LANG
en_US.UTF-8

##提示

在Linux系统中,支持中文的字符集有Unicode、GB1232、UTF-8、GBK、GB18030,通过命令locale,echo $LANG可以查询系统默认使用的字符集是否支持中文,如果你的系统默认字符集不支持中文,请浏览扩展阅读,了解相关中文字符集的信息,在根据你架构的实际需求选择字符集。

扩展阅读:

http://zh.wikipedia.org/wiki/GB18030

http://zh.wikipedia.org/wiki/GB2312

http://zh.wikipedia.org/wiki/UTF8

http://zh.wikipedia.org/wiki/GBK

http://zh.wikipedia.org/wiki/Unicode

2、Linux是否支持Windows字体(黑体、宋体)?

在测试之前,整个WEB站点的PHP代码是通过SVN更新至线上的服务器,其中有一点需要说明的是,在使用PHP的GD函数imagefttext()将文本写入图片时,引用了Windows端的字体库(simhei.ttf黑体、simsun.ttc宋体、simfang.ttf仿宋),所以我们怀疑是否因为Linux系统不支持Windows系统的字体而引起的,为此在Linux系统下添加了Windows系统的字体库,不幸的是问题并没有解决;引用Linux字体库也是如此;

##扩展阅读:

如何向Linux添加Windows字体

http://www.cnblogs.com/hiflex/archive/2012/08/12/2634532.htmlhttp://os.51cto.com/art/201402/429516.htm

3、是否由PHP编译参数引发中文乱码问题?

通过phpinfo()函数输出测试环境与线上环境的PHP编译参数,相互对比发现线上环境比测试环境多了个--enable-gd-jis-conv参数,对此,我们在PHP官方文档中查的如下信息:

*虽然 imagettftext()文档标明只接受UTF-8编码,但如果PHP编译时启用–enable-gd-jis-conv选项的话,那么非ASCII字符(例如汉字、拼音、希腊文和箭头) 会被当成EUC-JP编码(phpinfo中美其名曰“支持JIS编码的字体”), 从而导致乱码(由于西文字体没有假名或汉字,一般表现为全部是方框)。

Although imagettftext()documentation indicates it only accepts UTF-8 encoding, but if–enable-gd-jis-conv is specified when compiling PHP, then non-ASCII characters(like Chinese, accented characters, Greek and arrows) will be (mis-)treated asEUC-JP encoding (referred to as “JIS-mapped Japanese Font Support” in phpinfo)leading to mojibake (this usually shows up as hollow rectangles, as most fontsfor western text lacks glyphs for kanji or kana).

3、1 启用PHP参数–enable-gd-jis-conv,测试结果如下:

Firefox浏览器附加web调试工具firebug

#提示:从图中输出的结果,我们可以得知服务器端是支持中文字符集,问题发生在GD函数imagefttext()将文本信息写入图片时,发生了乱码的情况,附加测试图片如下:

3、2 禁用PHP参数–enable-gd-jis-conv,测试结果如下:

我想说,调试bug是一个非常细心,讲究团队协作的事情,首先,我们先不管问题是不是由开发人员、运维人员造成的,但是你需要明白的是两个部门它是一个团队,彼此间需要相互协作,争取在最短的时间内解决问题,因为在没有得到最终的结论之前,我们都无法确定问题是谁导致的,该由谁去负责,希望这篇文档能帮助到大家;

扩展阅读:

http://nekotoba.nfshost.com/b/2011/04/267/a-workaround-for-imagettftext-garbage-chracters-due-to-enable-gd-jis-conv

PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案,布布扣,bubuko.com

时间: 2024-10-15 08:19:47

PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案的相关文章

VS2010中wmain入口函数中使用wprintf输出中文乱码问题

生活中的单例 中国(China),位于东亚,是一个以华夏文明为主体.中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语.中国疆域内的各个民族统称为中华民族,龙是中华民族的象征.古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式. 详解单例模式 单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从"单例"字面意思上理解为-一个类只有

jquery的ajax()函数传值中文乱码解决方法介绍

前台 jQuery.post("/MailTemplate/SaveMailTemplate?Code=" + item.Code + "&DisplayName=" +encodeURI   (item.DisplayName) + "&Body=" +encodeURI(item.Body), {}, function (data) {                                if (data == 'S

php常用函数之Math、GD篇

float abs(float); 用途:求绝对值 >>例子:$abs = abs( -4.5 );  => 输出 : 4.5; float round(float,int n); 用途:对浮点数四舍五入n位 >>例子:echo round( 1.955555,2 ); => 输出 : 1.96; int ceil(float); 用途:进一法取整 >>例子:echo ceil( 9.001 ); => 输出 : 10; float floor(flo

oracle 函数(储存过程)或表保存卡死,被锁定的解决方案

1.如果函数被锁住,那么肯定是有进程在使用这个函数 Select b.SID,b.SERIAL# From dba_ddl_locks a, v$session b Where a.session_id = b.SID And a.name = '函数名或者表名'; 2.在oracle使用命令杀死进程 alter system kill session 'SID,SERIAL#'; 3.遇到在oracle中无法杀死的情况,则在OS层杀死该进程 select spid, osuser, s.pro

php函数substr_replace中文乱码的替代解决方法

$str = "中华人民共和国"; $len = mb_strlen($str,'utf-8'); if($len>=6){ $str1 = mb_substr($str,0,2,'utf-8'); $str2 = mb_substr($str,$len-2,2,'utf-8'); } else{ $str1 = mb_substr($str,0,1,'utf-8'); $str2 = mb_substr($str,$len-1,1,'utf-8'); } $this->a

关于json_encode()函数转换后,中文乱码或出现空白情况

json_encode()函数通常将数组转换成json和前端页面进行交互,但 有时候转换后的数据中文出现乱码或空白: 原因:是文件的编码不一致,不是utf8导致的,应该把文件全部改为utf8编码格式即可了!!

php函数base64_encode后的参数包含加号解析出错的解决方案

在进入主题之前我们先来看这样如下代码,test.php <?php $url = "test2.php?name=".base64_encode('用来做测试的字符串')."&age=23"; header("Location:$url"); test2.php <?php var_dump(base64_decode($_GET['name'])); die(); 访问http://localhost/test.php地址时

php GD图像处理 中文乱码的问题

网上好多用iconv("gb2312","utf-8","中文字符");处理的贴子,试了下,都不能用,只有这个能用: $a=mb_convert_encoding("思想感情有","html-entities","utf-8"); 保存下.

jquery的ajax()函数传值中文乱码的解决方案

$.ajax({ dataType : ‘json’ ,type : ‘POST’ ,url : ‘http://localhost/test/test.do’ ,data : {id: 1, type: ‘商品’} ,success : function(data){ } } );问题: 提交后后台action程序时,取到的type是乱码 解决方法: 方法一:提交前采用encodeURI两次编码,记住一定是两次 1.修改以下代码 data:{id:1, type:encodeURI(encod