c语言ascw,VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别
多年來,BASIC程序員一直使用Asc和Chr函數來訪問和操作ASCII字符集。隨著Unicode被主流操作系統和應用程序所接受,需要改進版本的Asc和Chr函數已經開發了。為了滿足這種需求,針對Windows系統的Microsoft Visual Basic(4.0以及更高版本)包括了AscB、ChrB和AscW、ChrW函數。
Unicode是一種為代替ANSI標準而設計的,把字符編碼成數值形式的標準。因為ANSI標準只使用單個字節來代表每個字符,它受最大256個字符的限制。雖然這對于英語受眾來說已經足夠,但當考慮到全球軟件市場時,它無法滿足。使用Unicode標準,每個字符由兩個字節表示,因此整個的Unicode字符集包括了65536個可能的位置。
微軟的Windows NT, Windows 2000, and Microsoft OLE 2.0完全基于Unicode設計,而且Visual Basic(4.0以及更高版本)在內部使用Unicode格式來表示所有的字符串。AscW和ChrW函數允許對Unicode字符的全范圍訪問。這些函數和原始的Asc、Chr函數運行方式相同,唯一的區別在于新函數支持0到65536的參數,而原來的只能是0到255。許多Visual Basic對象(例如調試窗口、標簽、文本框),當它們不知道怎樣顯示一個Unicode字符時,會返回一個“?”。
因為所有的字符串現在在內部由Unicode格式表示,它不像以前表示一個字符串里的二進制數據那樣簡單。使用Chr函數來分配數據給一個字符串的結果不再向以前一樣。例如:
stringvar = Chr(65)
結果是一個兩字節長的字符串,其中第一字節的值為65,第二字節的值為0(這是Unicode表示的字母“A”)。需要記住的是,從ANSI轉換至Unicode并不總是意味著像這個例子里做的那樣,僅僅添加一個值為0的第二字節。例如,大多數在130~159范圍內的ANSI字符碼擁有完全不同的Unicode值。嘗試運行’Debug.Print AscW(Chr(130))’,然后一個8218的值會顯示出來。
當前,windows系統需要一個“小端序(Little-Endian)”的處理器,意味著對于多字節數據中,最低有效位是存儲在第一字節處,其他的依次出現在后面字節。這解釋了為什么Unicode字符"A"在內部如下表示:
-------------------
| 65 | 0 |
-------------------
byte 0 byte 1
AscB和ChrB函數可用于代替那些原來由Asc和Chr函數完成的功能,因為這些函數允許操作單個字節量。如果你想要一個4字節的連續地有二進制值65、66、67、68的字符串,那么使用Chr函數不起作用。你必須使用ChrB函數代替。例如:
stringvar = ChrB(65) & ChrB(66) & ChrB(67) & ChrB(68)
或者,你可以使用創建新字節數據型的數組并且用這種方法操縱你的二進制數據。
下面列出的是對一些簡單使用這些函數的結果的解釋以便深入闡明這個信息。
Print Asc(Chr(255)) –> "255"
這里沒有什么新奇的,除了Chr函數返回一個占據兩字節的Unicode字符而不是一個一字節的ANSI字符外。
Print Asc(ChrB(255)) –> 5 –無效的過程調用
這個使用返回了一個錯誤因為Asc函數總是期待至少2個字節的參數但是ChrB函數僅僅返回一個字節。
Print Asc(Chr256)) –> 5 –無效的過程調用
盡管Chr函數返回一個兩字節的Unicode字符,它還是只能使用0到255的數字作為它的參數(注意,在一個支持DBCS的系統中,Asc/Chr處理兩字節DBCS字符,轉換它們為Unicode)。使用ChrW函數允許對全部65536個字符地址的訪問。
Print AscW(ChrW(256)) –> "256"
這是本部分第一段所說的新版本。ChrW函數接受從0到65536的參數,且返回那個字符(在32位系統中)。AscW函數解釋這個兩字節的字符為一個Unicode字符并返回正確的Unicode值。
Print Asc(ChrW(256)) –> "65"
Print Asc(ChrW(5000)) –> "63"
這里發生的是,ChrW函數首先計算。ChrW(256)是字符"A",所以這個函數簡化為Asc("A"),而Unicode(和ANSI)對應"A"的數字是65。因為VB不知道怎樣顯示用Chr(5000)表示的字符,它就顯示了一個"?",而正如所期待的,Unicode和ANSI對應"?"的值為63。
Print AscB(Chr(65)) –> "65"
Print AscB(ChrW(256)) –> "0"
Print AscB(ChrW(257)) –> "1"
Print AscB(ChrW(555)) –> "43"
Print AscB(ChrW(65535)) –> "255"
所有這些返回的值能夠通過理解每個字符在內部如何表示來解釋(看上面提到的小端序),并且由于那個事實,即AscB函數只看它接收的字符的第一個字節。直觀來說,它看起來像如下圖表:
-------------------
Chr(65) | 65 | 0 |
-------------------
Chr(256) | 0 | 1 |
-------------------
Chr(257) | 1 | 1 |
-------------------
Chr(555) | 43 | 1 |
-------------------
Chr(65535)| 255 | 255 |
-------------------
byte 0 byte 1
AscB函數僅返回任何字符的第一個字節。
Print ChrB(65) –> ""
Visual Basic對這個對ChrB函數的調用什么都不顯示,因為ChrB函數僅返回一個一字節的字符串。像這樣的一個字節的字符串對Visual Basic毫無意義,因為它們不構成一個有效的Unicode字符(或者一系列字符)。
Print ChrB(65) & ChrB(0) –> "A"
在這個例子中,我們把兩個一字節的字符串連接成為一個單獨的兩字節的字符串。由于生成的位模式和Unicode的"A"一樣的,那就是Visual Basic輸出的東西。
總結
以上是生活随笔為你收集整理的c语言ascw,VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 嵌入式C语言编程课件,嵌入式系统C语言编
- 下一篇: 中超联赛提交函数的c语言,国家体育总局
