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("&#268;IA BUVO &#268;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")等操作本地文件用法,

JavaScript:读取文件夹中的文件

uni读取本地JSON数据文件

Javascript写入txt和读取txt文件示例

uni-app 缓存无法读取问题