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

2018-09-06 11:29

阅读:417

  研究编码,得知GB2312编码与区位码的关系,尝试之后,得此程序。
搜索,似乎没人写,故发此地。
原创首发:


任意转载,任意使用。
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>=A1ANDsHigh<=FE)then
CharToQWM=
ExitFunction
endif
ifNOT(sLow>=A1ANDsLow<=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
sResult=sResult&Cstr(iHigh)
endif
ifiLow<10then
sResult=sResult&0&Cstr(iLow)
else
sResult=sResult&Cstr(iLow)
endif
CharToQWM=sResult
EndFunction
----根据区位码得到字符的函数---------------------
FunctionQWMToChar(byValstr,byValdoCheckFlg)
dimsHex,sHigh,sLow,iLow,iHigh,sResult
-------------检查输入格式--------------
ifdoCheckFlgthen
ifLen(str)<>4then
QWMToChar=
ExitFunction
endif
--4位必须都是数字
dimi,iAsc
fori=1to4
iAsc=Asc(mid(str,i,1))
ifNOT(iAsc>=&H30ANDiAsc<=&H39)then
QWMToChar=
ExitFunction
endif
next
--区号,位号都要在01-94之间
iHigh=Clng(Left(str,2))
iLow=Clng(Right(str,2))
ifNOT(iHigh>=1ANDiHigh<=94)then
QWMToChar=
ExitFunction
endif
ifNOT(iLow>=1ANDiLow<=94)then
QWMToChar=
ExitFunction
endif
endif
-------------检查完毕------------------
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)
EndFunction

使用方法:
-----------------------------------------------------------------------------------------------------
复制代码 代码如下:
dimi,str,sChar
str=娃哈哈
fori=1toLen(str)
sChar=Mid(str,i,1)
Response.writesChar&:&CharToQWM(sChar)&<br>
next
-----------------------------------------------------------------------------------------------------
dimstr
str=160116021603}
ifinstr(str,)>0then
dims,sCharArray,i
sCharArray=Split(str,)
fori=0toUbound(sCharArray)
s=s&QWMToChar(trim(sCharArray(i)),True)
next
str=s
else
str=QWMToChar(str,True)
endif
.......
-----------------------------------------------------------------------------------------------------
3.在线使用

进入以上网址即可在线查阅。

上一篇:asp调用存储过程

下一篇:ASP分页函数


评论


亲,登录后才可以留言!