- 深入解析ASP核心技術
- 王洪影
- 666字
- 2019-01-03 18:15:50
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編碼到某種編碼的轉換。