好程序员
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>