VBS 的 fso:"Scripting.FileSystemObject" 不支持 UTF-8 編碼的文本文件

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章