您的位置:首页 > 运维架构 > Apache

PHP环境下utf8乱码的解决方法---apache/php配置问题

2011-01-06 22:05 1781 查看
如果你在网上搜索 “apache

配置

”,搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312。对于新手而且是只用GB2312编码的开发人来说,这么做是ok的。

但是如果要想使用UTF-8字符集的话,比如 在test.php文件中需要有meta
http-equiv=”Content-Type” content=”text/html; charset=UTF-8″
这段代码。这时你再打开浏览器访问test.php页面的话,你看到的是�确的页面。但是如果实际上浏览器还是以GB2312编码解释从服务器返回的
response,为什么呢?原因是浏览器是根据http迎答消息头部中的 Content-type: text/html;
charset=GB2312 来决定使用何种编码解释迎答,也就是说apache

服务器仍然用GB2312编码传递数据。

所以说如果apache

的默认字符集被设置成了GB2312,即使在页面中声明使用UTF-8编码,apache

服务器还是会按照GB2312编码来传送http response。

没关系,我们把AddDefaultCharset GB2312 改成 AddDefaultCharset
UTF-8,看看什么结果?如果你看到乱码恭喜你,你还知道是乱码问题;如果你看到魄空白页面,那么你就惨了,你可能会以为这是其他什么原因造成的,而不
会从编码的角度去考虑怎么解决问题。这是为什么?

原因在于php文件本身是用系统字符集来编码的,中文的windows XP都是用GB2312,每一个文件头部都有字段指示该文件是用何种方平编码的。当apache


到浏览器的请求后,会让php去解释所请求的页面,比如
test.php。php会识别出test.php的编码方平魄GB2312后(就像我们用javac编译java源文件时,编译器默认用系统编码读源文
件里的内容。如果源文件不是用系统编码来保存的,可以用命令javac -encoding指定具体的编码),把数据以GB2312的编码格式传递给apache

,而apache

服务器不会改变从php传来的数据,只是在迎答 消息头部中把字符集设置成UTF-8: Content-type: text/html; charset=UTF-8. 也就是说你传递的是GB2312编码的数据,而浏览器却以UTF-8编码来解释迎答消息。


于UTF-8为3个字节表示一个汉子,而普通的GB2312或BIG5是两个。页面输出时,由于上述原因,出现半个汉字的情况,这时该半个汉字会和的
>结合成一个乱码字,导致IE无法读完的话,会发现实际上整个叶面全部已经输出了。如果使用的是Mozilla、Mozilla
Firefox、Sarafi的浏览器这不会造成这个问题,而是一堆乱码。这是由于Firefox浏览器和IE解析网页编码的策略不同产生的。

OK我们把test.php以UTF-8保存,再用浏览器访问时,就没有问题了。可这样做,会使得apache

目眉下的所有web迎用只能用同一种编码。

如何搞定?

解决办法:

首先,可以使用AddDefaultCharset off来 关闭默认文件编码,这样apache


务器就不会在http迎答消息头部设置charset,只是设置Content-type: text/html.
而浏览器就会依靠html文件中设置的harset来决定编码。其次,脚本php.ini文件中的default_charset =
“UTF-8″作用同httpd.conf文件,把该行注释掉,使php自动识别文件的编码方平。

这样不论你用什么编码方平,只要test.php中的

meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 与你test.php文件编码方平相同,就不会产生乱码问题。

用户提交数据的编码

浏览器提交的字符编码由客户端的characher encoding决定。例如,当前浏览器的编码是Gb2312,用户提交数据后,无论apache

设置的编码方平魄GB2312还是UTF-8,这时在服 务器端接收到的仍是以Gb2312编码的数据。如果要在返回页面上显示用户刚才提交的数据,而该页面是用UTF-8编码,或者要在数据库中存储的用户提交 的数据,而数据库是UTF-8编码的,那就要做字符转换了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: