嘿嘿,看到這個題目,想必嚇了一大跳吧,或者是擺出一副不相信的表情?不用著急,請聽我慢慢道來。
話說這個VB6,很是無恥,居然內置了支持Unicode的功能,也就是說,當你讀入一個字符串時,它根據本地缺省語言的對應關系將之轉換為Unicode,輸出時,再從Unicode轉換為本地編碼。一方面,它當然方便啦,隨便出個什麼語言的版本都好方便的,而且在Unicode的系統上,如NT,那它可就如魚得水,Unicode畢竟是軟件發展的方向,像現在中文Win9X使用的GBK內碼,實際上就是向著Unicode走了一大步。可是在另一方面,這種支持實際上極大地延緩了字符串的處理時間!想想看,如果我們從文件裡讀一行並顯示,本來是很簡單的事情,可是在VB6裡面,實際上多了一段轉換到Unicode的時間,如果我們用字符串從原文件裡讀一行,然後分析,再寫到目的文件裡去,實際上就多了兩重的時間(本地到Unicode,unicode到本地)。當然對於這種小事,高手們想必也都有處理的辦法(如用byte數組來代替字符串)
說了這麼一大堆Unicode的壞話,還沒說到正題呢,由於VB6內置對Unicode的支持,而Unicode裡面分別和 GBK 以及Big5漢字都有對應關系,所以要實現轉換也只是一件小事,下面我們就有請本次女主角出場。(嘩嘩嘩嘩……掌聲不絕。)
函數strConv! 這個美眉大家可能在VB5裡面也都見過的,她有一些保镖,可以幫她把字符串在Unicode和本地編碼之間轉換,而在VB6裡面呢,strConv又多了一個保镖!大家請仔細看:
strConv(string,conversion) `VB5
StrConv(string,conversion,LCID) `VB6
string呢,就是預轉換的字符串了(提示一下,也可以使用byte數組)。
Conversion: 是一個整數,只決定轉換方式,VB裡定義了一些常量,如VBFromUnicode、VBUnicode等等,這些不用我解釋大家應該也明白了吧。
LCID:哈,這可是VB6新加入的參數了,長整數, 可以指定編碼方式, 如&H404,即Big5碼, &H804即GBK碼,合理運用這個參數,就可以寫出一個非常簡單的內碼轉換工具!
什麼?你還不明白,哎,就把源碼給你看看吧。
Dim iReadNumber As Integer `讀文件號
Dim iWriteNumber As Integer `寫文件號
Dim mem() As Byte `byte數組
Dim strFileName As String `文件名
Dim lLength As Long `文件長度
`將文件內容讀入mem byte數組
iReadNumber = FreeFile
strFileName = TextFileName.Text
lLength = FileLen(strFileName)
ReDim mem(lLength) As Byte
Open strFileName For Binary As #iReadNumber
Get #iReadNumber,,mem
Close #iReadNumber
`將mem數組轉換為Big5碼所對應的Unicode碼
mem = StrConv(mem,vbUnicode,&H404)
`再將Unicode碼轉換為GBK編碼
mem = StrConv(mem,vbFromUnicode,&H804)
`寫到源文件裡去
iWriteNumber = FreeFile
Kill strFileName
Open strFileName For Binary As #iWriteNumber
Put #iWriteNumber,,mem
Close #iWriteNumber
`結束
(筆者用的是中文VB6 Professional 版 + Service Pack3)。
怎麼樣,方便吧?短短幾行就把Big5碼轉換到GBK了。
不過方便是方便了,但是呢,也有它自己的缺陷,老實說,用這種方法來轉換GB\GBK到Big5碼是非常好的,可是把Big5碼轉過來的話,結果居然是繁體的!看起來真的是很不爽,哎,這也沒有辦法,Unicode裡面就是這個對應關系;此外呢,這樣轉換畢竟是走了兩步路,所以呢,從理論上來說,比別的轉碼軟件慢了一倍!
但是這樣轉過來可是有兩大好處的,一,不會有錯誤的碼,這可是國際標准喲,你想什麼? 二,不會有缺字,就像現在的很多轉碼軟件都是從Big5轉到GB碼,想想看15000字轉到六七千字,一一映射,沒有缺字才怪!