VBS文件编码与Unicode

标签: , , , ,

在《VBS字符串的内部实现》中谈到了 VBS 字符串在内部是以 Unicode 的形式来保存的,然而在外部,VBS 脚本文件的编码却不一定是 Unicode,本文主要探讨一下 VBS 文件编码与 Unicode 的关系。

我们一般是用 ANSI 编码注①来保存我们的 VBS 脚本文件,但是 ANSI 编码并不兼容某些 Unicode 字符,比如版权符号“©” ,再比如某些中国古代的文字“𪚥”注②,这种时候就需要保存为 Unicode 编码了。

常用的 Unicode 编码方式有 Unicode Little Endian、Unicode Big Endian 和 UTF-8,而每种编码方式又可以分为带 BOM 和不带 BOM,那么 VBScript 解释引擎支持哪一种方式的 Unicode 编码呢?

于是我做了一个测试,以下面的代码为例

MsgBox "Copyright © 2011 Demon"

分别保存为 Unicode Little Endian、Unicode Big Endian 和 UTF-8,带 BOM 的和不带 BOM 的,测试结果如下:

Unicode Little Endian With BOM Copyright © 2011 Demon
Unicode Little Endian Without BOM Copyright © 2011 Demon
Unicode Big Endian With BOM Error: Invalid character
Unicode Big Endian Without BOM Error: Invalid character
UTF-8 With BOM Error: Invalid character
UTF-8 Without BOM Copyright 漏 2011 Demon

由结果可知,只能保存为 Unicode Little Endian 编码,带不带 BOM 都可以。

简单解释一下为什么保存为不带 BOM 的 UTF-8 会显示“Copyright 漏 2011 Demon”:不带 BOM 的话 VBScript 引擎会按照 ANSI 编码来解析 VBS 文件,“©”符号保存为 UTF-8 后是 C2A9,正好对于 ANSI 中的“漏”,所以就出现了上面的结果。

当然,你也可以使用 Windows 脚本文件(*.wsf)来支持 UTF-8 编码,或者在 ANSI 编码中使用 ChrW 函数来获取 Unicode 字符,我就不举例子了。

注①:准确的说 ANSI 并不是一种编码,ANSI 实际对应的编码跟系统设置的代码页有关,在简体中文系统中代码页默认是936,对应 GB2312 编码。在本文中 ANSI 代表 GB2312。

注②:笔划最多的汉字,由四个繁体龙字组成,你的系统不一定能显示这个字。

随机文章:

  1. VBS对象作为过程参数是ByVal还是ByRef?
  2. VBS中&H前缀十六进制数的陷阱
  3. VBS Scripting.Dictionary 排序
  4. Perl常用的内置特殊变量
  5. VeryPDF PDF2Word v3.1 注册码

4 条评论 发表在“VBS文件编码与Unicode”上

  1. shirne说道:

    放了300%,終於看清是四個”龍”字
    話說我看的古文也不少了,真沒見過這個字。

  2. […] Demon's Blog  »  程序设计  »  OpenTextFile与Unicode « VBS文件编码与Unicode […]

  3. ahdung说道:

    请教Demon,我用vbs调用Microsoft.XMLDOM来操作xml文件:
    Set doc = CreateObject(“Microsoft.XMLDOM”)
    doc.load(“c:\a.xml”) ‘该xml是utf8编码
    doc.save(“c:\a.xml”) ‘得到的新文件就变成ANSI了

    请问如何得到utf8的xml文档,求帮助。

留下回复