FileSystemObject的 - 读Unicode文件

经典的ASP,VBScript的背景下。

很多文章,包括这个微软的,说你不能使用 FileSystemObject的读取Unicode文件。

我遇到过这个问题而回,所以交换而不是使用FileSystemObject.OpenTextFile(这确实接受最后一个参数指示是否打开该文件作为unicode使用的ADODB.Stream代替,每READTEXT的例子在这里,但实际上并没有工作)。

然而,试图读取一个UNC文件共享(权限有关的问题)的文件时,在痛苦的世界中的ADODB.Stream结果。 因此,调查这个,我偶然发现了下面的方法,它的工作原理)与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文件?

--------------解决方案-------------

是的,这说明文件过时。 该脚本组件都经过一系列的变化在其早期的(他们中的一些,如果你正在使用早期绑定进行了重大更改),但是由于至少WK2000 SP4和XP SP2就已经很稳定。

只是要小心你所说的unicode的意思。 有时候这个词Unicode是使用更广泛,可以覆盖的Unicode任何编码。 FSO不读对Unicode的例子UTF8编码。 对于您需要依傍的ADODB.Stream。

'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
'.
'.

我认为微软并没有正式说明它支持Unicode,因为:

  1. 它不会检测Unicode文件使用的字节顺序标记在文件的开始,
  2. 它仅支持小端的UTF-16 Unicode文件(你需要的,如果存在删除字节顺序标记)。

这是我一直在使用已成功(几年),自动检测和读取Unicode文件用FSO一些示例代码(假定他们是小端并包含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

我会说,如果它的工作原理,使用它;-)

我注意到你指的是MS文章是从Windows 2000(!)脚本指南。 也许是过时的。

我正在写一个Windows 7的小工具,并运行到同样的问题,如果可能的话,你可以在你的文件只需切换到另一种编码,例​​如:ANSI编码“窗口-1251”。 通过这种编码它是工作的罚款。

如果您使用的是这写一个网站的话,最好的方法是使用另一种开发方法避免这种对象。

分类:脚本 时间:2012-06-11 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.035 (s). 10 q(s)