Skip to content

牛国柱

欲成国柱,须勤耕田

  • 首页
  • 专题
  • 分享
  • 关于
  • 每周一句

Archive 2011-02-27

  • 首页   /  2011   /  
  • 2 月
学习生活 2 月 27,2011

关于页面的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 月 13,2011

人说山西好风光

飞云楼
在老家万荣县城的东岳庙内,有一座宏伟的纯木质结构,无一枚铁钉的飞云楼。相传始建于唐为鲁班所造,现存为明正德元年(公元1506年)所建。
飞云楼

楼外观三层,内部实为五层,总高约23米。下层平面正方,边长14米,面阔进深各五间。中层变为折角十字,在方形楼体每面中内各伸出一座歇山抱厦屋顶,上层又恢复为正方,但仍在各面悬挑出一个歇山抱厦,外形与中层相似;最上再覆以十字歇山顶。各层歇山抱厦与最上十字歇山的巧妙组合,构成了飞云楼非常丰富的立面构图。飞云楼体量不大,但有四层屋檐、12个三角形屋顶侧面、32个屋角,宛若万云簇拥,飞逸轻盈。楼木面不髹漆,通体显现木材本色,醇黄若琥珀。
飞云楼侧面

飞云楼有四个特点,一是底层,即第一层为正方形,面阔进深五间,南北直通,木柱林立,中间有4根通天柱,共同直通楼顶,周围32个木柱巧妙联成棋盘状,共同支撑楼体。二是飞云楼为木质结构,无论大小接口,均为榫铆套之,没有一个铁钉。在中国楼阁式建筑中实为罕见。三是明露三层,隐于平座之内却有两层暗层,实为五层。然而在外边看不见个中秘密。四是飞云楼三层四滴水,十字歇山顶,在抱夏的各层檐下,共345组斗拱,形态变化多端,极象云朵簇拥,鲜花盛开一般,各掾翼角起翘,给人以凌空欲飞之感。
飞云楼

飞云楼翘掾翼角共有32个每个翘角尖,站立着一位顶盔甲的武士,盔甲明亮,色彩绚丽威武雄壮。楼角各悬有风铃,迎风摆动清脆悦耳。楼顶披复着黄绿琉璃瓦,每当天晴气朗,耀人眼目。因其造型奇特,斗拱密布,云带缠绕,故名飞云楼。
楼角上的风铃以及站立的武士

作者 牛 国柱

Proudly powered by WordPress | Theme: BusiProf by Webriti