关于网上流行的ASP版GB2312转UTF-8 函数的错误修正!

本文修正了一个流行的GB2UTF转换函数中的错误,该错误会导致包含数字或字母的字符串被截断。通过对比错误和正确的函数版本,帮助读者理解如何避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

同样的文章我已经发到蓝色理想:http://bbs.blueidea.com/thread-3060231-1-1.html

 

 

 

原函数出处:http://www.blueidea.com/tech/program/2006/3538.asp

感谢作者发出来这个函数,但是发现这个函数有个小错误:

如果需要转换的字符串都是汉字就没问题。但是如果遇到中间有数字或字母的时候就会被截断,而得不到正确的结果。

比如:GB2UTF("中国人")可以得到正确得到转换。

但是:GB2UTF("中国人3chinese!")就会得到“中国人5”

不但被截断,而且第一个数字还对应不上。

虽然是个小小的错误,但是可能会给新手造成误导!

为了不再让大家浪费时间查找错误,特将错误的版本和正确的版本贴上以便学习者进行对比!

网上流行存在错误的版本:

Function U2UTF8(Byval a_iNum)
    Dim sResult,sUTF8
    Dim iTemp,iHexNum,i
    iHexNum = Trim(a_iNum)
    If iHexNum = "" Then
        Exit Function
    End If
    sResult = ""
    If (iHexNum < 128) Then
        sResult = sResult & iHexNum
    ElseIf (iHexNum < 2048) Then
        sResult = ChrB(&H80 + (iHexNum And &H3F))
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&HC0 + (iHexNum And &H1F)) & sResult
    ElseIf (iHexNum < 65536) Then
        sResult = ChrB(&H80 + (iHexNum And &H3F))
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&H80 + (iHexNum And &H3F)) & sResult
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&HE0 + (iHexNum And &HF)) & sResult
    End If
    U2UTF8 = sResult
End Function

Function GB2UTF(Byval a_sStr)
    Dim sGB,sResult,sTemp
    Dim iLen,iUnicode,iTemp,i
    sGB = Trim(a_sStr)
    iLen = Len(sGB)
    For i = 1 To iLen
         sTemp = Mid(sGB,i,1)
         iTemp = Asc(sTemp)
         If (iTemp>127 OR iTemp<0) Then
             iUnicode = AscW(sTemp)
             If iUnicode<0 Then
                 iUnicode = iUnicode + 65536
             End If
        Else
            iUnicode = iTemp
        End If
        sResult = sResult & U2UTF8(iUnicode)
    Next
    GB2UTF = sResult
End Function


Response.Write(GB2UTF("冥蝶"))’可以得到正确结果
Response.Write(GB2UTF("冥蝶308641836"))’得到:冥蝶5,结果错误!


修改之后的版本:

Function U2UTF8(Byval a_iNum)
    Dim sResult,sUTF8
    Dim iTemp,iHexNum,i
    iHexNum = Trim(a_iNum)
    If iHexNum = "" Then
        Exit Function
    End If
    sResult = ""
    If (iHexNum < 128) Then
        sResult = sResult & ChrB(iHexNum)
    ElseIf (iHexNum < 2048) Then
        sResult = ChrB(&H80 + (iHexNum And &H3F))
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&HC0 + (iHexNum And &H1F)) & sResult
    ElseIf (iHexNum < 65536) Then
        sResult = ChrB(&H80 + (iHexNum And &H3F))
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&H80 + (iHexNum And &H3F)) & sResult
        iHexNum = iHexNum \ &H40
        sResult = ChrB(&HE0 + (iHexNum And &HF)) & sResult
    End If
    U2UTF8 = sResult
End Function

Function GB2UTF(Byval a_sStr)
    Dim sGB,sResult,sTemp
    Dim iLen,iUnicode,iTemp,i
    sGB = Trim(a_sStr)
    iLen = Len(sGB)
    For i = 1 To iLen
         sTemp = Mid(sGB,i,1)
         iTemp = Asc(sTemp)
         If (iTemp>127 OR iTemp<0) Then
             iUnicode = AscW(sTemp)
             If iUnicode<0 Then
                 iUnicode = iUnicode + 65536
             End If
        Else
            iUnicode = iTemp
        End If
        sResult = sResult & U2UTF8(iUnicode)
    Next
    GB2UTF = sResult
End Function
Response.Write(GB2UTF("冥蝶"))’可以得到正确结果
Response.Write(GB2UTF("冥蝶308641836"))’得到:冥蝶308641836,结果不再被截断!



本文代码只供学习研究!
发表人:冥蝶 2012年5月11日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值