php header定义页面编码

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才是无敌的!

 

唉,这个乱码的问题拖延了好久,也浪费了很多时间,今天有点压力之下才找到解决方法,不然真不知道啥时能弄懂这个问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值