研究編碼,得知GB2312編碼與區位碼的關係,嘗試之後,得此程序。
搜索,似乎沒人寫,故發此地。
原創首發:
http://bbs.blueidea.com
http://mytju.com/classcode/
任意轉載,任意使用。
1.簡述
(1)GB2312標準的定義,其實就是區位碼。
共94行,94列,行就是區號,列就是位號。
如“啊”字區號為16,位號為01,它的區位碼就是1601。
(2)每個字符由區號+位號組成,共佔兩個字節。
每個字節都是01-94,與通信控制符0-31衝突,
所以,將區號和位號分別加上32,以避免衝突。
(3)由上,每個字節是33-126,與ASCII編碼0-127衝突,
所以將最高位置為1,也就是加上128,以避免衝突。
所以,最終,每個字節為161-254。
2。實現
原理很簡單,加加減減即可實現。
直接將我完成的函數帖於此處。
複製代碼代碼如下:
'----取得區位碼的函數---------------------
FunctionCharToQWM(byValstr)
dimsHex,sHigh,sLow,iLow,iHigh,sResult
sHex=Hex(Asc(str))'取得字符的內碼的編碼,如B0A1,此編碼是正確的順序,不必交換高低位。
sHigh=Left(sHex,2)'取得編碼的高位,如B0。
sLow=Right(sHex,2)'取得編碼的低位,如A1。
'GB2312內碼範圍為&HA1A1--&HFEFE,每個字節都在A1-FE之間。
ifNOT(sHigh>="A1"ANDsHigh<="FE")then
CharToQWM=""
ExitFunction
endif
ifNOT(sLow>="A1"ANDsLow<="FE")then
CharToQWM=""
ExitFunction
endif
'GB交換碼僅使用了7位,高位置1,即為內碼。反過來就是將高位置0,可得到交換碼。
iLow=Clng("&H"&sLow)-128
iHigh=Clng("&H"&sHigh)-128
'區位碼與控制碼0-31衝突,所以加上32之後,即是交換碼。反過來減去32即可。
iLow=iLow-32
iHigh=iHigh-32
'OK,區位碼已經得到。
sResult=""
ifiHigh<10then
sResult=sResult&"0"&Cstr(iHigh)
else