
欢迎来到 TechNet 专栏,在这里,Microsoft 脚本专家将为您解答与系统管理脚本编写有关的各种常见问题。如果遇到系统管理脚本编写方面的问题,请将电子邮件发送到 scripter@microsoft.com。我们不能保证回答收到的所有问题,但是我们将尽最大的努力。
同时,不要忘了查看您好,脚本专家!存档。
今日问题:如何以 Unicode 格式打开文本文件?
您好,脚本专家!我有一些含有 Unicode 字符的文本文件。当我尝试使用某脚本打开这些文件时,得到的全都是乱码。如何以 Unicode 格式打开文本文件?
-- FA
您好,FA。您知道,真正伟大的魔术师不会精心编制一些复杂的戏法,依靠陷阱门、暗藏控制板和巨大的烟雾来掩盖他们所实施的任何把戏。反之,魔术师知道最好的戏法就是简单的戏法,这种戏法依靠的是一些明显、直观但又容易被多数人忽视的道具。脚本专家的工作方式往往也是这样。在解答某问题时,我们会进行彻底深入的研究,然后再集体讨论数小时,设法编写出一个除了脚本专家谁都不可能想出的脚本。我们在开玩笑是吗?是的。与之相反,脚本专家通常依靠的是明显、直观但又容易被多数人忽视的途径。
这不是华而不实,而是确实简单得多。
以您的问题为例。让我们假设您有一个非常简单的 Unicode 文件,该文件由下面的字符组成:
abc ėěĩ def
当您使用某脚本打开该文件并回显其内容时,会发生什么事情?嗯,您得到类似于以下内容的结果:

有意思。如果您从文件中移除所有的 ASCII 字符(只留下 ėěĩ),则在您回显内容时会得到以下结果:

这看起来甚至更酷了。老兄,我们整天都能做这个!
但是,正如我们经理刚刚指出的,我们整天真正能够(应该)做的就是完成这个专栏。很有道理;记住这一点后,我们提供了以下脚本,用来打开 Unicode 文件并正确回显其内容:
Const ForReading = 1
Const TriStateTrue = -1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\test.txt", ForReading,False,TriStateTrue)
strText = objFile.ReadAll
objFile.Close
Wscript.Echo strText
首先,我们定义一对常量:ForReading 和 TriStateTrue。ForReading 用于打开文本文件进行读取;TriStateTrue 用于 - 嗯,我们还不想透露这个令人兴奋的结局。您会马上发现 TriStateTrue(使用值 -1)是用来做什么的。
创建 FileSystemObject 实例后,我们再调用 OpenTextFile 方法来打开文件 C:\Scripts\Test.txt。您说“令人厌烦”是什么意思?看一看我们传递给 OpenTextFile 的参数:
Set objFile = objFSO.OpenTextFile("c:\scripts\test.txt", ForReading,False,TriStateTrue)
前两个参数对您来说或许不难理解:它们只不过是要打开的文件的完整路径和常量 ForReading。您说对了:在读取文本文件方面,这是标准的操作程序。但其它两个参数(一个是 False,另一个是常量 TriStateTrue)的用途是什么呢?
这就是脚本专家玩魔术的地方。第三个可选参数是 Boolean 参数,如果它为 True,则在无法找到指定文本文件的情况下它会创建该文件。因为我们只是想打开现有文件,所以将该参数设为 False(也是默认值)。
下面介绍第四个参数,我们的老朋友 TriStateTrue。如果传递给 OpenTextFile 方法的第四个参数为 -1,则该文件将作为 Unicode 文件打开。就是这么简单。如果省略第四个参数则文件将以 ASCII 格式打开;将第四个参数设置为 -1,然后说变就变!- 您的文件将以 Unicode 格式打开。
谢谢,谢谢,您太客气了。为我们可爱的助手 Marjorie 鼓鼓掌怎么样?
那是什么?它当然行得通。看一看我们生成的消息框:

下一个戏法,我们现在将让一个脚本专家消失,然后重新出现在他儿子的中学棒球比赛中。(我们有没有提过这个脚本专家的小孩在赛季过去四分之三时击球率就超过了 .400?别担心:我们并不是想烦扰您听一个脚本专家父亲自夸他儿子。- 编者注:只有其他脚本专家才会体会到这种乐趣。)明天见。
欢迎访问您好,脚本专家!- 存档