關於網上流行的ASP版GB2312轉UTF-8 函數的錯誤修正!

來源:互聯網
上載者:User

 

同樣的文章我已經發到藍色理想: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 = sResultEnd FunctionFunction 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 = sResultEnd FunctionResponse.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 = sResultEnd FunctionFunction 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 = sResultEnd FunctionResponse.Write(GB2UTF("冥蝶"))’可以得到正確結果Response.Write(GB2UTF("冥蝶308641836"))’得到:冥蝶308641836,結果不再被截斷!



本文代碼只供學習研究。
發表人:冥蝶 2012年5月11日

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.