background image

php 应用乱码问题解决方法集

1) 

 

使用 标签设置页面编码

这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可以为 

GB2312、GBK、UTF-8(  

和 MySQL 不同,MySQL   

是 UTF8)等等。因此,大部分页面可以

采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错

 

误而产生乱码。但是有的时候我们会发现有了这句还是不行,不管 xxx 是哪一种,浏览
器采用的始终都是一种编码,这个情况我后面会谈到。

 

 

请注意, 是属于 HTML 

 

信息的,仅仅是一个声明,仅表明服务器已经把 HTML 信

息传到了浏览器。

2) header(“content-type:text/html; charset=xxx”);

 

这个函数 header() 

 

的作用是把括号里面的信息发到 http 标头。如果括号里面的内

 

容为文中所说那样,那作用和 标签基本相同,大家对照第一个看发现字符都差不多的。

 

但是不同的是如果有这段函数,浏览器就会永远采用你所要求的 xxx 编码,绝对不会不
听话,因此这个函数是很有用的。为什么会这样呢?

 

那就得说说 http 

 

标头和 HTML 信息

的差别了:

http 

 

标头是服务器以 http 

 

协议传送 HTML 

 

信息到浏览器前所送出的字串。而 标签

 

是属于 HTML 

 

信息的,所以 header() 发送的内容先到达浏览器,通俗点就是 

header() 

 

的优先级高于 (不知道可不可以这样讲)

 

。假如一个 php 页面既有

header(“content-type:text/html;charset=xxx”)

 

,又有,浏览器就只认前者 http 标

 

头而不认 meta 

 

了。当然这个函数只能在 php 页面内使用。

同样也留有一个问题,为什么前者就绝对起作用,而后者有时候就不行呢?这就是

接下来要谈的 Apache 的原因了。

3) AddDefaultCharset
Apache 

 

根目录的 conf 

 

文件夹里,有整个 Apache 

 

的配置文档 httpd.conf。

 

用文本编辑器打开 httpd.conf

 

,第 708 行(不同版本可能不同)有 

AddDefaultCharset xxx,xxx 为编码名称。这行代码的意思:设置整个服务器内的网

 

页文件 http 

 

标头里的字符集为你默认的 xxx 字符集。有这行,就相当于给每个文件都加

 

了一行 header(“content-type:text/html; charset=xxx”)

 

。这下就明白为什么明明 设

 

置了是 utf-8

 

,可浏览器始终采用 gb2312 的原因。

 

如果网页里有 header(“content-type:text/html; charset=xxx”),就把默认的

 

字符集改为你设置的字符集,所以这个函数永远有用。如果把 AddDefaultCharset xxx 

前面加个 #”

 

,注释掉这句,而且页面里不含 header(“content-type…”),那这个时候

 

就轮到 meta 标签起作用了。

下面列出以上的优先顺序:
header(“content-type:text/html; charset=xxx”)
.. AddDefaultCharset xxx
..

 

如果你是 web 程序员,建议给你的每个页面都加个 header(“content-

type:text/html;charset=xxx”),这样就可以保证它在任何服务器都能正确显示,可移
植性也比较强。

4) php.ini 

 

中的 default_charset 配置: