ASP实现GB2312字符与区位码的相互转换的代码

时间:2022-01-07 01:22:28

研究编码,得知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。实现 
原理很简单,加加减减即可实现。 
直接将我完成的函数帖于此处。 

复制代码代码如下:


'----取得区位码的函数---------------------  
Function CharToQWM(byVal str)  
    dim sHex,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之间。  
    if NOT (sHigh>="A1" AND sHigh<="FE") then  
        CharToQWM=""  
        Exit Function  
    end if  
    if NOT (sLow>="A1" AND sLow<="FE") then  
        CharToQWM=""  
        Exit Function  
    end if  
    '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=""  
    if iHigh<10 then  
        sResult = sResult & "0" & Cstr(iHigh)  
    else  
        sResult = sResult & Cstr(iHigh)  
    end if  
    if iLow<10 then  
        sResult = sResult & "0" & Cstr(iLow)  
    else  
        sResult = sResult & Cstr(iLow)  
    end if  
    CharToQWM=sResult  
End Function  
'----根据区位码得到字符的函数---------------------  
Function QWMToChar(byVal str,byVal doCheckFlg)  
    dim sHex,sHigh,sLow,iLow,iHigh,sResult  
    '-------------检查输入格式--------------  
    if doCheckFlg then  
        if Len(str)<>4 then  
            QWMToChar=""  
            Exit Function  
        end if  
        '--4位必须都是数字  
        dim i,iAsc  
        for i=1 to 4  
            iAsc=Asc(mid(str,i,1))  
            if NOT (iAsc>=&H30 AND iAsc<=&H39) then  
                QWMToChar=""  
                Exit Function  
            end if  
        next  
        '--区号,位号都要在01-94之间  
        iHigh=Clng(Left(str,2))  
        iLow=Clng(Right(str,2))  
        if NOT (iHigh>=1 AND iHigh<=94) then  
            QWMToChar=""  
            Exit Function  
        end if  
        if NOT (iLow>=1 AND iLow<=94) then  
            QWMToChar=""  
            Exit Function  
        end if  
    end if  
    '-------------检查完毕------------------  
    iHigh=Clng(Left(str,2))  
    iLow=Clng(Right(str,2))  
    iHigh=iHigh + 32 + 128  
    iLow=iLow + 32 + 128  
    sHex=Hex(iHigh) & Hex(iLow)  
    QWMToChar=Chr("&H" & sHex)  
End Function 


使用方法: 
----------------------------------------------------------------------------------------------------- 

复制代码代码如下:


dim i,str,sChar  
str="娃哈哈"  
for i=1 to Len(str)  
       sChar=Mid(str,i,1)   
       Response.write sChar & ":" & CharToQWM(sChar) &"<br>"  
next  
-----------------------------------------------------------------------------------------------------  
dim str  
str="1601|1602|1603}  
if instr(str,"|")>0 then  
       dim s,sCharArray,i  
       sCharArray=Split(str,"|")  
       for i=0 to Ubound(sCharArray)  
              s=s & QWMToChar(trim(sCharArray(i)),True)  
       next  
       str=s  
else  
       str=QWMToChar(str,True)  
end if 

....... 
----------------------------------------------------------------------------------------------------- 
3.在线使用 
http://www.mytju.com/classcode/tools/quweima.asp 
进入以上网址即可在线查阅。