FileSystemObject - 读取 Unicode 文件
Posted
技术标签:
【中文标题】FileSystemObject - 读取 Unicode 文件【英文标题】:FileSystemObject - Reading Unicode Files 【发布时间】:2010-11-27 11:25:11 【问题描述】:经典 ASP、VBScript 上下文。
很多文章,包括this Microsoft one,说你不能使用 FileSystemObject 来读取 Unicode 文件。
我不久前遇到了这个问题,因此根据 ReadText 示例 here 改用 ADODB.Stream,而不是使用 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 文件吗?
【问题讨论】:
【参考方案1】:我会说如果它有效,请使用它;-)
我注意到您提到的 MS 文章来自 Windows 2000 (!) 脚本指南。也许它已经过时了。
【讨论】:
【参考方案2】:是的,文档已过期。脚本组件在早期确实经历了一系列更改(如果您使用早期绑定,其中一些更改是重大更改),但是至少从 WK2000 SP4 和 XP SP2 开始,它一直非常稳定。
请注意 unicode 的含义。有时 unicode 这个词的使用范围更广,可以涵盖任何 unicode 编码。 FSO 不读取例如 Unicode 的 UTF8 编码。为此,您需要使用 ADODB.Stream。
【讨论】:
谢谢。在这种情况下,被读取为“unicode”的文件都是由使用 FSO.OpenTextFile(TriStateTrue 表示“unicode”)打开文件以写入文件的类似代码创建的,因此应该安全地坚持使用 FSO 来读取它们全部。 ADODB.Stream 在尝试从另一台机器上的文件共享中读取时会导致各种 hoo-haa,这就是我要远离它的原因。【参考方案3】:我认为 MS 没有正式声明它支持 unicode,因为:
-
它不会使用文件开头的字节顺序标记检测 unicode 文件,并且
它仅支持 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
【讨论】:
【参考方案4】:我正在编写一个 windows 7 小工具并遇到同样的问题,如果可能的话,您可以将文件切换为另一种编码,例如:ANSI 编码“windows-1251”。使用这种编码,它工作正常。
如果您使用它来编写网站,那么最好使用另一种开发方法来避免这些对象。
【讨论】:
【参考方案5】:'assume we have detected that it is Unicode file - then very straightforward
'byte-by-byte crawling sorted out my problem:
'.
'.
'.
else
eilute=f.ReadAll
'response.write("ČIA BUVO ČARLIS<br/>")
'response.write(len(eilute))
'response.write("<br/>")
elt=""
smbl=""
for i=3 to len(eilute) 'First 2 bytes are 255 and 254
baitas=asc(mid(eilute,i,1))
if (i+1) <= len(eilute) then
i=i+1
else
exit for
end if
antras=asc(mid(eilute,i,1))*256 ' raidems uzteks
'response.write(baitas)
'response.write(asc(mid(eilute,i,1)))
'response.write("<br/>")
if baitas=13 and antras=0 then 'LineFeed
response.write(elt)
response.write("<br/>")
elt=""
if (i+2) <= len(eilute) then i=i+2 'persokam per CarriageReturn
else
skaicius=antras+baitas
smbl="&#" & skaicius & ";"
elt=elt & smbl
end if
next
if elt<>"" then
response.write(elt)
response.write("<br/>")
elt=""
end if
end if
f.Close
'.
'.
【讨论】:
以上是关于FileSystemObject - 读取 Unicode 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VBA 中使用 FileSystemObject 打开的文件中编辑一行?
js中new ActiveXObject("Scripting.FileSystemObject")等操作本地文件用法,