好程序员web前端教程分享js文件引用编码方式

好程序员 web 前端教程分享 js 文件引用编码方式 js 外部文件编码由这些因素决定: 1. 如果 Apache DefaultCharset ,则 js 文件解析用服务器指定的编码; 2. 如果 PHP header 声明 charset 为编码 utf-8 ,则文件编码用 utf-8 来解析。 3. 如果以上两个都为空,页面编码由 meta 标签决定。 4. 如果以上声明都没有,则会使用 utf-8 来解析。 5. 如果页面编码为 gbk ,而 js 文件编码为 utf-8 ,则可以在 js 属性中定义 charset='utf-8'

 

昨天帮同事解决的一个问题 ,GBK 的页面 ( 不要问我为什么 GBK, 因为 GBK, 所以 GBK), 引用了 Google map API, 但是由于 GoogleMap API 返回的 js 脚本是 utf-8 , 所以导致在 IE , 浏览器无法正确解析 .

 

也就是 , 由于服务器中生成的 HTML 是基于 gbk 编码的 , 并且由于 Apache DefaultCharset( 后叙 ), 所以导致 IE 会以 gbk 编码去解析从外部引入的 GoogleMap js, 那肯定是不能正确解释的 .

 

浏览器判断一个页面的编码有俩个途径 , 一种是通过 HTTP 响应头 ,

 

HTTP/1.x 200 OK

Date: Sat, 18 Oct 2008 21:53:51 GMT

Server: Apache/2.0.52 (Red Hat)

X-Powered-By: PHP/5.3.0alpha2

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html; charset=GB2312

注意最后一行 , 这个是由 HTTP 头部指明的页面编码格式 .

 

另外一种就是我们常见的 , 也会另很多初学者困惑的 meta:

 

问题就在于 , 没有一个统一的标准 , 来指明这俩中方式的优先级 , 不同的浏览器有着不同的优先级策略 . 这也就是为什么 , 我们在 FF 下正常浏览的页面 , IE 下会乱码的原因 .

 

我之前的文章 Apache Charset 设置中已经介绍过了在 Apache 下设置 DefaultCharset 以后产生的影响 ,

 

这个问题已经遇到过俩次了,就是页面中明确指明了编码是 UTF8, 但是显示是乱码。

 

虽然知道解决方法,也知道是 Apache 的原因,但是一直没有去找其所以然,今天趁机,就研究了一下。

 

1. 页面没有指定 charset Apache 配置 defaultcharst gbk , 页面文件编码是 utf-8

 

结果 : 乱码,使用 wireshark 抓包,发现服务器返回的 header 中指明了 :

 

Content-Type:text/html;charset=GBK

结论:当页面没有指明 charset 的时候, Apache defaultcharset 起作用

 

2. 页面指定 charset utf-8, Apache 配置 defaultcharset gbk. 页面文件是 utf-8

 

<head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>

        <div id="page-header">

          测试 Apache DefaultCharset

        </div>

</body>

</html>

结果还是出现乱码。

 

结论:当 Apache 配置了 DefaultCharset, 将忽略页面的 charset 申明。

 

3 PHP header 申明 charset utf8, Apache 配置 defaultcharst gbk, 页面文件编码是 utf8

 

header("Content-Type:text/html; charset=utf-8");

结果 页面显示正常。

 

4 Apache 设置 DefaultCharset off

 

结果,页面显示正常。

 

翻阅了下 Apache2 的手册:

 

AddDefaultCharset 指令

说明当应答内容是 text/plain text/html 时,在 HTTP 应答头中加入的默认字符集

语法 AddDefaultCharsetOn|Off|charset

默认值 AddDefaultCharsetOff

作用域 serverconfig,virtualhost,directory,.htaccess

覆盖项 FileInfo

状态核心 (C)

模块 core

 

当且仅当应答内容是 text/plain text/html 时,此指令将会在 HTTP 应答头中加入的

默认字符集。理论上这将覆盖在文档体中通过 <meta> 标 签指定的字符集,但是实际

的行为通常取决于用户浏览器的设置。 AddDefaultCharsetOff 将会禁用此功能。

 

AddDefaultCharsetOn 将启用 Apache 内部的默认字符集 iso-8859-1 。您

也可以指定使用在 IANA 注册过的字符集名字 中的另外一个 charset

比如说:

AddDefaultCharsetutf-8

也就是说,当 Apache 不指定 defaultcharset 的时候,页面编码由页面自己的 meta 标签指定。

 

Apache 指定的时候,将忽略页面中的 meta 标签指定的编码 . 但是容许脚本直接 header 编码方式给客户端

 

最后,还有一个问题没有得出结果:

 

Apache 和页面都没有指定的时候, 又如何?

 

我在自己的机器上,如果都不指定, 默认还是 utf8

 

在服务器端生成 response 内容以后 , 如果脚本没有显示的调用 header 发送编码申明 , 那么 Apache 就会根据 DefaultCharset 生成响应 HTTP 头部的 Content-type 中的 charset 字段 ;

 

反之如果脚本显示申明了 , 那么就会按照脚本 header 申明中的 charset 设置 .

 

这样到了浏览器端以后 , 浏览器就可以根据 HTTP 头的 charset 申明来按照特定的编码格式解析获取到的 HTML 代码 , 但现在的问题是 , 页面是 GBK , 但是引用的外部 js 文件是 utf8 编码的 , 这样的情况 , 我们可以使用一个 script 的属性来解决 :

 

  <script language='javascript' src='....'  charset='utf-8'></script>