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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
面向对象设计模式的核心法则
Nov 10 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
js实现字符全排列算法的简单方法
May 01 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
如何用Node写页面爬虫的工具集
Oct 26 Javascript
基于javascript实现贪吃蛇小游戏
Nov 25 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
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
Vue拖拽组件开发实例详解
2018/05/11 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
python实现连接mongodb的方法
2015/05/08 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python实现三次样条插值
2018/12/17 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
python实现简单的学生管理系统
2021/02/22 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
Unix/Linux开发面试题
2016/08/16 面试题
员工晚婚的请假条
2014/02/08 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
大队委员竞选稿
2015/11/20 职场文书