代码之家  ›  专栏  ›  技术社区  ›  AdaTheDev

FileSystemObject-读取Unicode文件

  •  9
  • AdaTheDev  · 技术社区  · 15 年前

    很多文章包括 this Microsoft one 你说 不能 使用FileSystemObject读取Unicode文件。

    不久前我遇到了这个问题,所以根据ReadText示例,改用ADODB.Stream here 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
    

    这是在使用FSO读取unicode文件时没有任何明显的问题,因此我对所有引用(包括MS)都感到困惑,说您不能使用FSO读取unicode文件。

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

    5 回复  |  直到 15 年前
        1
  •  11
  •   Tao    15 年前

    1. 它不会检测到在文件开头使用字节顺序标记的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
    
        2
  •  4
  •   AnthonyWJones    15 年前

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

    只要小心你所说的unicode是什么意思。有时unicode一词的使用范围更广,可以涵盖unicode的任何编码。例如,FSO不读取unicode的UTF8编码。为此,您需要使用ADODB.Stream。

        3
  •  4
  •   Daumantas    12 年前
    '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
     '.
     '.
    
        4
  •  0
  •   Tor Haugen    15 年前

    我会说如果它有效,就用它;-)

    我注意到您提到的MS文章来自Windows 2000(!)脚本指南。也许它已经过时了。

        5
  •  0
  •   Alexanderius    14 年前

    我正在编写一个Windows7小工具,遇到了同样的问题,如果可能的话,您可以将文件切换到另一种编码,例如:ANSI编码“windows-1251”。使用这种编码,它工作得很好。