关于页面的charset设置以及不同charset下js乱码的问题

近期在工作中碰到js在两台不同的测试服务器上,一台出现乱码,但另一台没有乱码的情况,经过艰难的查找验证,发现是charset设置的问题造成的。其中涉及到html的charset设置,服务器的charset设置以及js的chasrset设置,同时发现还存在记事本保存内容时的默认编码等一些问题。

1、html的charset设置,服务器的charset设置以及js的chasrset设置

 
下面是同一页面在本地查看以及两台测试服务器及一台发布服务器上的charset设置:

原始html页面的charset设置:
原始页面charset

第一台测试服务器上的charset设置:
第一台测试服务器charset

第二台测试服务器上的charset设置:
第二台测试服务器charset

正式发布服务器上的charset设置:
正式发布服务器charset

从中可以看到第二台测试服务器上的charset设置变为了GBK。其中的奥秘在于charset设置的优先级别:

header(”content-type:text/html; charset=xxx”)
default_charset xxx
AddDefaultCharset xxx
<META http-equiv=”content-type” content=”text/html; charset=xxx”>

解释如下:
1.<META http-equiv=”content-type” content=”text/html;charset=xxx”>。这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx可以为GB2312,GBK,UTF-8(和MySQL不同,MySQL是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。<meta>是属于html信息 的,仅仅是一个声明,它起作用表明服务器已经把HTML信息传到了浏览器。但是像上面的情况,我们发现同一种的设置中,浏览器现出来的却是另外一种编码。

2. header(”content-type:text/html; charset=xxx”);这个函数header()的作用是把括号里面的信息发到http标头。如果括号里面的内容为文中所说那样,那作用和< META>标签基本相同,大家对照第一个看发现字符都差不多的。但是不同的是如果有这段函数,浏览器就会永远采用你所要求的xxx编码,绝对不会不听话。为什么会这样呢?那就得说说HTTPS标头和HTML信息的差别了:https标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串。因为meta标签是属于html信息的,所以header()发送的内容先到达浏览器,通俗点就是header()的优先级高于meta。假如一个php页面既有header(”content-type:text/html; charset=xxx”),又有<META http-equiv=”content-type” content=”text/html; charset=xxx”>,浏览器就只认前者http标头而不认meta了。但是这个函数只能在php页面内使用。同样的一个问题,为什么前者就绝对起作用,而后者有时候就不行呢?这就是接下来要谈的Apache的原因了。

3. AddDefaultCharsetApache。根目录的 conf 文件夹里,有整个Apache的配置文档httpd.conf。用文本编辑器打开httpd.conf,第708行(不同版本可能不同)有 AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件https标头里的字符集为你默认的xxx字符集。有这行,就相当于给每个文件都加了一行header(”content-type:text/html; charset=xxx”)。这下就明白为什么明明meta设置了是gb2312,但第二台服务器中浏览器采用GBK的原因了。如果网页里有 header(”content-type:text/html; charset=xxx”),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把AddDefaultCharset xxx前面加个“#”,注释掉这句,而且页面里不含header(”content-type…”),那这个时候就轮到meta标签起作用了。

4. default_charset在 php.ini 文件中可以定义 php 的默认语言: default_charset = “xxx”,xxx为编码名称。这行代码的意思是设置所有 php 的输出页面编码为 xxx。

因此,我们可以推测出上面的问题所在了,那就是第一台服务器和正式发布的服务器要么是屏蔽掉了AddDefaultCharset的函数,要么就是设置为gb2312了,第二台服务器一定是设置为GBK了。我们可以明天来验证一下第一台服务器的AddDefaultCharset的设置!

————–以下是建哥的验证结果—————-
第一台测试服务器果然是屏蔽掉了AddDefaultCharset设置了!

2、关于js乱码的问题我们下周接着研究。


2 thoughts on “关于页面的charset设置以及不同charset下js乱码的问题

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注