好程序员 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>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。