top
Loading...
VB6內置的內碼轉換功能
『俸伲吹秸飧鎏餑浚氡叵帕艘淮筇桑蛘呤前誄鲆桓輩幌嘈諾謀砬?不用著急,請聽我慢慢道來。
話說這個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了。
不過方便是方便了,但是呢,也有它自己的缺陷,老實說,用這種方法來轉換GBGBK到Big5碼是非常好的,可是把Big5碼轉過來的話,結果居然是繁體的!看起來真的是很不爽,哎,這也沒有辦法,Unicode里面就是這個對應關系;此外呢,這樣轉換畢竟是走了兩步路,所以呢,從理論上來說,比別的轉碼軟件慢了一倍!
但是這樣轉過來可是有兩大好處的,一,不會有錯誤的碼,這可是國際標準喲,你想什么? 二,不會有缺字,就像現在的很多轉碼軟件都是從Big5轉到GB碼,想想看15000字轉到六七千字,一一映射,沒有缺字才怪!
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗