官术网_书友最值得收藏!

2.2.3 字符串轉換為BSTR

看到BSTR,就應該想到ChrB函數,想到ChrB,就應該想到Asc和AscB,然后就是如何對字符串進行拆分的問題了。如果按字節拆分,那么得到的是每個字符的Unicode編碼的形式,如果按字符拆分,則得到當前所用編碼的形式。因為我們的目標是BSTR,所以按字節拆分就沒有意義了,因為先AscB然后再ChrB,是個圈,得到的東西和原來一樣。所以,一般轉為BSTR都是按字符拆分,然后用Asc配合ChrB使用。

ChrB的參數要求是0~255,而Asc返回的范圍要大得多。如果字符串中的每個字符都是英數字,那么沒有問題,它們的編碼數字都是小于255的。如果出現了漢字或其他編碼數字大于255的字符,那么就需要對編碼數字進行拆分了,拆分為兩個字節即可。如“啊”字的編碼十六進制形式是B0 A1,那么拆分為B0和A1即可。

看一下范例。

String2BStr.asp

<%
text = "今天下雪了o(0_0)o"
result = ""

'輸出字符長度
response.write "字符長度:" & Len(text) & "<br>"

'循環每一個字符
For i=1 To Len(text)
    oneChar = Mid(text, i,1)        '得到一個字符
    number = Asc(oneChar)                   '該字符對應的數字
    numberHex = Hex(number)                 '數字的十六進制形式

    If Len(numberHex)>2 Then
        '漢字等,十六進制形式大于兩位,即大于FF,如BDF1
        hexHigh = Left(numberHex,2)         '高字節,如BD
        hexLow = right(numberHex,2)         '低字節,如F1
        result = result & ChrB("&H" & hexHigh) & ChrB("&H" & hexLow) '拼接結果
    Else
        '英數字等
        result = result & ChrB("&H" & numberHex)   '拼接結果
    End If
Next
response.write "字符串內存形式:" & getMemoryFormat(text) & "<br>"
response.write "轉換為BSTR形式:" & getMemoryFormat(result) & "<br>"
response.write "輸出字符串形式:" & text & "<br>"
response.write "輸出BSTR形式:" & result

'得到字符串的內存存儲形式
Function getMemoryFormat(bstr)
    Dim result, i
    For i=1 To Lenb(bstr)
        numberHex = Hex(AscB(MidB(bstr, i,1)))
        If Len(numberHex) = 1 Then
                numberHex = "0" & numberHex
        End If
        result = result & " " & numberHex
    Next
    getMemoryFormat = result
End Function
%>

運行結果如圖2-7所示。

圖2-7 字符串轉換為BSTR

從結果可以看出BSTR形式與內存形式的不同,對于漢字來說,編碼是不同的,對于英數字來說,在BSTR形式中,每個字符只需占用一個字節。

字符串轉換為BSTR,概括起來理解,就是Unicode編碼到某種編碼的轉換。

主站蜘蛛池模板: 连云港市| 苏尼特左旗| 岑巩县| 平谷区| 东明县| 荆门市| 彭山县| 阿合奇县| 临安市| 苍南县| 全南县| 浏阳市| 乌鲁木齐县| 康平县| 利津县| 永定县| 珲春市| 鄂托克旗| 集贤县| 密云县| 南城县| 武邑县| 林周县| 徐闻县| 清流县| 体育| 博爱县| 闻喜县| 马关县| 永丰县| 门源| 新兴县| 沽源县| 紫金县| 交城县| 顺昌县| 屯留县| 资中县| 大同县| 武汉市| 客服|