如果你在网上搜索
“
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
,
这时在服务器端接收到的仍是以