scripting - FileSystemObject - 读取 Unicode 文件

标签 scripting asp-classic vbscript

经典 ASP、VBScript 上下文。

很多文章,包括this Microsoft one ,假设您无法使用 FileSystemObject 读取 Unicode 文件。

我不久前遇到了这个问题,因此根据 ReadText 示例改用 ADODB.Stream here ,而不是使用 FileSystemObject.OpenTextFile (它确实接受一个最终参数,指示是否以 unicode 打开文件,但实际上不起作用)。

但是,当尝试读取 UNC 文件共享上的文件(与权限相关的问题)时,ADODB.Stream 会带来痛苦。因此,在对此进行调查时,我偶然发现了以下方法,该方法适用于 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

这是使用FSO读取unicode文件,没有任何明显的问题,所以我对所有引用资料感到困惑,包括MS,说你不能使用FSO读取unicode文件。

还有其他人使用这种方法来读取 unicode 文件吗?是否有我遗漏的任何隐藏问题,或者您真的可以使用 FSO 读取 unicode 文件吗?

最佳答案

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

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

下面是我(几年来)成功使用的一些示例代码,用于使用 FSO 自动检测和读取 unicode 文件(假设它们是小端字节序并包含 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

关于scripting - FileSystemObject - 读取 Unicode 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410334/

相关文章:

powershell - 使用 Powershell 为 Word 文档添加页眉和页脚

api - PowerObject 或 WindowObject 类的 API 是什么?

http - 如何在 ASP 中执行 HTTP POST 请求?

c++ - 我可以为某些对象定义一个类方法吗?

Xcode,是否可以在构建时拦截和更改代码而不更新文件?如果是这样,怎么办?

database - 服务器正在生成页面时显示加载屏幕

sqlite - 防止 IIS 对 SQLite 数据库文件保持文件锁定

vbscript - 如何在visual basic脚本上引用主文件夹

vbscript - 尝试绑定(bind)到 AD 用户对象时出现错误 2147463168

Git 钩子(Hook)预提交错误 : "command not found"