what the fuck,又TM这么久没写blog了,看来总结果然少了啊,其实是我不想写。。。
最近php写了个页面,但是取到的json数据后,显示到web页面上却怎么调都乱码,研究了老久的编码问题,实在找不到原因,今天终于搞好了,也明白了问题出在哪。
很多时候当我们自以为解决了问题时,其实才刚刚摸到问题的表象!
环境是这样的:redhat:LANG=zh_CN.gb18030 + apache + php + json data with utf8 encode
首先终端LANG改成了zh_CN.UTF-8,php页面编码的的确确是用的utf-8,包括head.html meta也声明了charset=utf-8,但是浏览器自动选择的编码却死活都是gb18030,页面显示的编码方式也是gb18030,而不是utf-8,这实在很不解。这也导致了json数据取过来之后没法转,json数据是utf-8的,是没法转成gb18030的,哪个大神转成功的话,麻烦告知一下方法。
解决方法:在每个访问的php页面都添加一行header声明编码的代码:
header("content-type:text/html; charset=utf-8");
需要注意的是,这行代码之前,不能有其他任何html or php代码,否则会出错;
这样添加之后,浏览器上查看页面就能看到编码方式是utf-8了,这个时候算是摸到问题的表象了。
问题出在哪呢?
Apache有个设置自动编码的配置,而配置的编码方式正是gb18030
AddDefaultCharset GB18030
查看apache的配置文件,可以看到这一行
这一行的作用就是所有访问apache页面的http请求,都会被apache先添加一个http头,并且声明了编码方式是gb18030,也就是配置中的编码方式。
所以说如果你的index.php 里面是require head.html,而head.html里面才定义charset=utf-8的话,是完全没有作用的。
解决方法就是重新定义header,添加header("content-type:text/html; charset=utf-8");这一行代码
他们之间的优先级是:
1、header("content-type:text/html; charset=utf-8");
2、apache AddDefaultCharset
3、html or php meta的charset
所以apache那个配置,各位各取所需的进行配置了,配成utf-8才是无敌的!
唉,这个乱码的问题拖延了好久,也浪费了很多时间,今天有点压力之下才找到解决方法,不然真不知道啥时能弄懂这个问题。