大家都知道 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