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

来源:互联网 发布:windows bash如何用 编辑:程序博客网 时间:2024/06/05 10:08

如果你在网上搜索

 

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

编码的,那就要做字符转换了。