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 相关文章推荐
javascript 动态参数判空操作
Dec 22 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
jQuery验证元素是否为空的两种常用方法
Mar 17 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
vue中实现弹出层动画效果的示例代码
Sep 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
十天学会php(1)
2006/10/09 PHP
怎样在UNIX系统下安装php3
2006/10/09 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php中动态变量用法实例
2015/06/10 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
react 生命周期实例分析
2020/05/18 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
农民工创业典型事迹
2014/01/25 职场文书
工作自我评价怎么写
2014/01/29 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
2014年计生标语
2014/06/23 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS