JScript中使用ADODB.Stream判断文件编码的代码


Posted in Javascript onJune 09, 2008

一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是不行的。

继续寻找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面刚好有我需要的内容。

其实说来也简单,就是把编码换一下,使用437,这个是IBM扩展过的ASCII编码,把ASCII编码的最高位也利用起来,将字符集中的字符从128个扩展到256个,而使用这个字符集读取的字符数据就相当于原始二进制数据了。

解决了障碍后,就要开始识别文件的编码了,通过使用ADODB.Stream对象来读取文件的开始两个字节,然后根据这两个字节就可以判断文件编码是什么了。

UTF-8文件如果带BOM的话,那么头两个字节就是0xEF、0xBB,再例如Unicode文件的开始两个字节是0xFF、0xFE,这些就是判断文件编码的依据。

需要注意的是,在ADODB.Stream读取字符时,并不是一一对应的,也就是说,如果二进制数据是0xEF,读取出来的字符经过charCodeAt之后,并不是0xFE,而是另外的值,这个对应表可以在上面提到的文章里查到。

程序代码:

function CheckEncoding(filename) {  
    var stream = new ActiveXObject("ADODB.Stream");  
    stream.Mode = 3;  
    stream.Type = 2;  
    stream.Open();  
    stream.Charset = "437";  
    stream.LoadFromFile(filename);  
    var bom = escape(stream.ReadText(2));  
    switch(bom) {  
        // 0xEF,0xBB => UTF-8  
        case "%u2229%u2557":  
            encoding = "UTF-8";  
            break;  
        // 0xFF,0xFE => Unicode  
        case "%A0%u25A0":  
        // 0xFE,0xFF => Unicode big endian  
        case "%u25A0%A0":  
            encoding = "Unicode";  
            break;  
        // 判断不出来就使用GBK,这样可以在大多数情况下正确处理中文  
        default:  
            encoding = "GBK";  
            break;  
    }  
    stream.Close();  
    delete stream;  
    stream = null;  
    return encoding;  
} 

这样,在需要的时候,通过调用CheckEncoding函数就可以获取文件的编码了。
希望此文对你有所帮助。
Javascript 相关文章推荐
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
javascript常用的方法分享
Jul 01 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
生成无限制的微信小程序码的示例代码
Sep 20 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
tracking.js实现前端人脸识别功能
Apr 16 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
javascript 数组的方法集合
Jun 05 #Javascript
js程序中美元符号$是什么
Jun 05 #Javascript
js字符编码函数区别分析
Jun 05 #Javascript
JavaScript 应用类库代码
Jun 02 #Javascript
javascript数组的扩展实现代码集合
Jun 01 #Javascript
javascript String 的扩展方法集合
Jun 01 #Javascript
用javascript做拖动布局的思路
May 31 #Javascript
You might like
php学习笔记之 函数声明(二)
2011/06/09 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP会话处理的10个函数
2015/08/11 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
php文件缓存方法总结
2016/03/16 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
jquery div拖动效果示例代码
2013/12/08 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
Python中的包和模块实例
2014/11/22 Python
python 中split 和 strip的实例详解
2017/07/12 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
校园安全教育广播稿
2014/02/17 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
质量保证书怎么写
2015/02/27 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书