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

作者:xujiwei 来源:HotHeart's BLOG 时间:2008-06-08 13:03:00 

在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,因此需要通过一个特别的方法来获取文件开关的编码标识。

一开始使用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函数就可以获取文件的编码了。

标签:adobe.stream,编码,jscript
0
投稿

猜你喜欢

  • Python自动化导出zabbix数据并发邮件脚本

    2022-08-18 12:31:46
  • 用python如何绘制表格不同颜色的excel

    2022-08-09 22:05:11
  • python pandas loc 布尔索引示例说明

    2021-02-28 22:43:19
  • SQL Server 全文搜索功能介绍

    2024-01-27 13:50:45
  • python使用arcpy.mapping模块批量出图

    2021-03-12 04:28:15
  • MySQL学习笔记之数据的增、删、改实现方法

    2024-01-27 04:07:41
  • Python3利用SMTP协议发送E-mail电子邮件的方法

    2023-10-12 17:39:32
  • 在Python的Flask框架中验证注册用户的Email的方法

    2022-12-03 04:42:35
  • pycharm debug功能实现跳到循环末尾的方法

    2023-08-03 02:29:01
  • 浅谈如何使用python抓取网页中的动态数据实现

    2021-10-19 08:47:18
  • 浅析python 通⽤爬⾍和聚焦爬⾍

    2021-06-13 00:14:23
  • 如何把数组转换成字符串?

    2009-11-06 13:49:00
  • MySQL字符集查看方法

    2010-12-14 15:14:00
  • Python使用docx模块处理word文档流程详解

    2023-03-08 15:45:06
  • python识别验证码的思路及解决方案

    2022-02-02 16:05:13
  • 利用J2ME与ASP建立数据库连接

    2010-04-03 20:53:00
  • 让插入到 innerHTML 中的 javascript 跑起来

    2008-07-01 13:14:00
  • 新手如何发布Python项目开源包过程详解

    2023-02-27 13:08:05
  • python实现切割url得到域名、协议、主机名等各个字段的例子

    2022-02-26 11:02:25
  • js实现tab选项卡函数代码

    2024-04-19 10:43:25
  • asp之家 网络编程 m.aspxhome.com