大家都知道 VBS 中 fso 读文件的用法 :
Set fso=CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(yjjsfn) '--fso不支持utf-8格式,故用Adodb.Stream代替之见ReadFile
s = f.ReadAll
f.Close
set f = nothing
set fso = nothing
今天用 fso 读个简单的文本文件,其中无中文,全为字母和数字,但是奇怪的是,读出的内容头部总是有几个乱码文字,试了几次无果,怀疑是编码问题导致的,因为之前读 GB2312 的文本文件一直是正常的。
回想了一下,貌似 VB6 的时候就是无法直接读写处理 UTF-8 编码格式的文本文件,看来 VBS 是继承了这个传统。
于是查到用 Adodb.Stream 读取文本文件时可以指定编码,顺便附上写文件的正确函数,
注意 Stream 要执行了 .Open 操作后再设置编码格式,否则无用!,
以下代码已在正常使用,同时抱怨下哪些未经测试就乱发出来的转载代码,不知道调试很浪费生命吗?!
public function saveFile(data,recfilen,CodePage)
dim fxt,txt
set Astream=CreateObject("Adodb.Stream")'asp Server.CreateObject("Adodb.Stream")
fxt=mid(recfilen,InStrRev(recfilen,".")+1)
txt=false
if fxt="asp" or fxt="xml" or fxt="aspx" or fxt="php" or fxt="txt" or fxt="jsp" or fxt="htm" or fxt="html" or fxt="js" then
txt=true
end if
if txt then
Astream.type=2 '1 bin,2 txt
else
Astream.type=1 '1 bin,2 txt
end if
Astream.Mode = 3' adModeRead =1
' adModeReadWrite =3
' adModeRecursive =4194304
' adModeShareDenyNone =16
' adModeShareDenyRead =4
' adModeShareDenyWrite =8
' adModeShareExclusive =12
' adModeUnknown =0
' adModeWrite =2
Astream.open
'Astream.CharSet = "GB2312"
'Astream.LoadFromFile(recfilen) '装载文件
'Assp=Astream.size
Astream.Position =0 '装载文件时设置为Assp
'Astream.Writetext tmpstr00,1
if txt then
'data=BytesToStr(data)
Astream.CharSet =CodePage ' "GB2312"
Astream.Writetext data,1
'Astream.CharSet = "GB2312"
else
Astream.Write data
end if
'msgbox recfilen
Astream.SaveToFile recfilen,2
' "F:\temp\a.jpg",2
Astream.close
set Astream=Nothing
end function
public Function ReadFile(FileUrl, CharSet)
Dim Str
Set stm = CreateObject("Adodb.Stream")
stm.Type = 2
stm.mode = 3
stm.Open
stm.charset = CharSet
stm.loadfromfile FileUrl
Str = stm.readtext
stm.Close
Set stm = Nothing
ReadFile = Str
End Function