PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案
admin
2023-07-02 16:44:49
0次

阐述

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

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


root@exiuxiu-web1:~#locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
 
root@exiuxiu-web1:~#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函数p_w_picpathfttext()将文本写入图片时,引用了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官方文档中查的如下信息:

 

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

 

Although p_w_picpathttftext()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

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

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


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


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

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


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

 

扩展阅读:

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


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...