FileSystemObject - 读取Unicode文件

Ada*_*Dev 11 vbscript scripting asp-classic

经典ASP,VBScript上下文.

包括这个Microsoft在内的很多文章都说你不能使用FileSystemObject来读取Unicode文件.

我曾经遇到过这个问题,所以转而使用ADODB.Stream ,而不是使用这里的ReadText示例,而不是使用FileSystemObject.OpenTextFile(它接受一个指示是否以unicode打开文件的最终参数,但实际上并不是工作).

但是,ADODB.Stream在尝试读取UNC文件共享上的文件(与权限相关的问题)时会导致痛苦.所以,调查这个,我偶然发现了以下方法:a)使用unicode文件,b)跨UNC文件共享:

dim fso, file, stream
set fso = Server.CreateObject("Scripting.FileSystemObject")
set file = fso.GetFile("\\SomeServer\Somefile.txt")
set stream = file.OpenAsTextStream(ForReading,-1) '-1 = unicode
Run Code Online (Sandbox Code Playgroud)

这是使用FSO读取unicode文件而没有任何明显的问题,所以我很困惑所有的引用,包括MS,说你不能使用FSO来读取unicode文件.

有没有其他人使用这种方法来读取unicode文件?我有什么隐藏的陷阱,或者你真的可以使用FSO读取unicode文件吗?

Tao*_*Tao 10

我认为MS没有正式声明它支持unicode,因为:

  1. 它不会使用文件开头的字节顺序标记来检测unicode文件
  2. 它仅支持Little-Endian UTF-16 unicode文件(如果存在,您需要删除字节顺序标记).

下面是一些示例代码,我已成功使用(几年)自动检测和读取带有FSO的unicode文件(假设它们是little-endian并包含BOM):

'Detect Unicode Files
Set Stream = FSO.OpenTextFile(ScriptFolderObject.Path & "\" & FileName, 1, False)
intAsc1Chr = Asc(Stream.Read(1))
intAsc2Chr = Asc(Stream.Read(1))
Stream.Close
If intAsc1Chr = 255 And intAsc2Chr = 254 Then 
    OpenAsUnicode = True
Else
    OpenAsUnicode = False
End If

'Get script content
Set Stream = FSO.OpenTextFile(ScriptFolderObject.Path & "\" & FileName, 1, 0, OpenAsUnicode)
TextContent = Stream.ReadAll()
Stream.Close
Run Code Online (Sandbox Code Playgroud)


Ant*_*nes 4

是的,该文档已过时。脚本组件在早期确实经历了一系列更改(如果您使用早期绑定,其中一些更改是重大更改),但是至少从 WK2000 SP4 和 XP SP2 开始,它就非常稳定。

请注意 unicode 的含义。有时,unicode 这个词的使用范围更广,可以涵盖 unicode 的任何编码。例如,FSO 不读取 unicode 的 UTF8 编码。为此,您需要依靠 ADODB.Stream。