同一页面引入多个JS文件的编码问题
![Click me to search the title by google.](https://i-blog.csdnimg.cn/blog_migrate/0777f88b4492c713b8a4d86c62958a4d.gif)
原来只是觉得IE解析HTML文件的时候,需要知道其传输编码,才能正确处理,而从来没有在意过JavaScript文件的编码问题。结果今天发现同一页面中的多个JavaScript文件如果保存编码不同,也会有出错的问题。这个一般怎么会遇到呢?
原来写的js文件,从来没有关心过他们的编码问题。可是后来不知怎么的,发现一些单独都好使得文件,被同时引用到一个页面中时,就错误不断,根本不能执行。Debug半天,原来是文件编码问题搞得鬼。
一般我们在中文OS中保存文本文件,默认都是一GB2312编码保存的,比如VS.NET 2003,2005都是这样。可是当我们在脚本代码中写有"©"这些符号后,保存文件会提示让你保存为Unicode格式。如果你不加理会,仍然保存为GB2312,那么下次打开这个文件你会发现"©"变成"?"@_@。这样的字符还有一些,比如在Windows中的高位ASCII字符,它们的Unicode定义就是一些比较怪异的字符,如果用GB2312强行存这些字符,打开后会被两两合并为汉字或成为乱码。
回到我们脚本文件编码的问题上来,如果我们在同一个页面中引用多个JavaScript文件,而这些文件的保存编码又不同(有GB2312有又Unicode),就可能出错。当然不是总都出,这也是最要命的。由于对于7bit ASCII码,不管什么编码都是通用的,也不会有解码问题,可是如果文件里包含了汉字,就有可能出错了。
比如,GB2312保存的js文件:
var
str
=
'这是一个GB2312编码文件。';
var
description
=
'
this
file saved as GB2312 encoding.';
可以在选择编码为GB2312的IE中正确的被引用。
Unicode编码保存的js文件:
var
strW
=
'这是一个Unicode编码文件。';
var
descriptionW
=
'
this
file saved as Unicode encoding.';
可以在选择编码为Unicode的IE中正确的被引用。
而这两个文件在下列引用中,不管怎么选择IE编码也是不能正确执行结果:(
<
html
>
<
head
>
<
title
>
Test Encode
</
title
>
<
script
src
="Unicode.js"
language
="javascript"
></
script
>
<
script
src
="GB2312.js"
language
="javascript"
></
script
>
</
head
>
<
body
>
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
<
script
language
="javascript"
>
alert(strW + '/r/n' + descriptionW);
alert(str + '/r/n' + description);
</
script
>
</
body
>
</
html
>
不过如果js中只有低位ASCII字符,不同编码的文件引用到一个页面不会有问题。
测试文件 下载
原来写的js文件,从来没有关心过他们的编码问题。可是后来不知怎么的,发现一些单独都好使得文件,被同时引用到一个页面中时,就错误不断,根本不能执行。Debug半天,原来是文件编码问题搞得鬼。
一般我们在中文OS中保存文本文件,默认都是一GB2312编码保存的,比如VS.NET 2003,2005都是这样。可是当我们在脚本代码中写有"©"这些符号后,保存文件会提示让你保存为Unicode格式。如果你不加理会,仍然保存为GB2312,那么下次打开这个文件你会发现"©"变成"?"@_@。这样的字符还有一些,比如在Windows中的高位ASCII字符,它们的Unicode定义就是一些比较怪异的字符,如果用GB2312强行存这些字符,打开后会被两两合并为汉字或成为乱码。
回到我们脚本文件编码的问题上来,如果我们在同一个页面中引用多个JavaScript文件,而这些文件的保存编码又不同(有GB2312有又Unicode),就可能出错。当然不是总都出,这也是最要命的。由于对于7bit ASCII码,不管什么编码都是通用的,也不会有解码问题,可是如果文件里包含了汉字,就有可能出错了。
比如,GB2312保存的js文件:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
Unicode编码保存的js文件:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
而这两个文件在下列引用中,不管怎么选择IE编码也是不能正确执行结果:(
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
不过如果js中只有低位ASCII字符,不同编码的文件引用到一个页面不会有问题。
测试文件 下载
posted on 2005-03-23 12:36 birdshome 阅读(5220) 评论(14) 编辑 收藏 网摘 所属分类: Jscript&Dhtml开发
评论
看来你现在专门研究js了。
#2楼 回复 引用
我现在一般都是把js文件改成.aspx后缀来调用了,这样就不会再出现编码的问题,之前被这个问题折腾了好长一段时间,现在终于算是好了。#3楼 回复 引用 查看
web.config<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
gb2312
gb2312
#4楼 回复 引用
类似的问题我也遇到过,里面有中文注释就出错!于是乎我把注释都删除了!~
#5楼 回复 引用 查看
这个问题我前不久实施项目的时候碰到过。还好知道怎么解决(一阵捣鼓,到处设编码。。。)。现在有个习惯是基本上独立的 js 文件里不写中文。
#6楼 回复 引用
你可以把所有的单独的js文件都用记事本打开,然后选择另存为,编码使用utf-8保存就能和aspx一起正常使用了#7楼 回复 引用
把@写成 asc 码 @#169。gb2312的处理还好办,utf-8的处理很麻烦的。
#8楼 回复 引用
如果你使用服务器端的程序也好办,可以使用宽字节转换。#9楼 回复 引用
hammer!~~这个问题上次我们一起做项目的时候不就已经知道了吗?怎么这么不长记性~~~~~#10楼 回复 引用
我在日文下也碰到此问题,但是我把2个javascript文件都改成utf8还是错,上传到2个服务器上,一个正常,另一个出错,为什么呢?
#11楼 回复 引用
这问题我也曾经遭遇过,我的apsx页面都是utf-8的,因为特定时间段访问量巨大,服务器配置烂又要求即时,所以能省就省啊,凡事需要JS里要用到高位字符全部抽到一起,然后将所有仅含ASCII字符的文件保存为ASCII编码格式,带高位字符的保存为utf-8,另外还开启压缩放到缓存里去,总觉得有点BT,好抠门的说。#12楼 回复 引用
这还算不上什么,更叫人哭笑不得的是,由于企业未填写企业名称,导致JS文件出错,想了N多办法,试了N多编码,上传编译搞了N多次,最后发现是由于他们没有填写企业名称而造成的,最后简单的加了个判断,竟然不出错了,晕的很啊#13楼 回复 引用
我觉得在引用js文件时指定其编码比较好<script src="/XX.js" type="text/javascript" encoding="utf-8"></script>
一般都不会有什么问题