嘿嘿,看到這個題目,想必嚇了一大跳吧,或者是擺出一副不相信的表情?不用著急,請聽我慢慢道來。 話說這個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字轉到六七千字,一一映射,沒有缺字才怪!
|