同樣的文章我已經發到藍色理想: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日