[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

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

上一篇:[ASP]共享个我写的URL编码的解码函数--URLDecode
下一篇:[转贴]電子中文-文字-學術語

添加日期:2007-5-11 16:06:04 快速返回   返回列表 阅读3490次
研究编码,得知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
进入以上网址即可在线查阅。

4.感谢阅读。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved