VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函數(shù)之間的區(qū)別
- 2020-10-27 08:00:00
- Demon 轉(zhuǎn)貼
- 4889
多年來(lái),BASIC程序員一直使用Asc和Chr函數(shù)來(lái)訪問(wèn)和操作ASCII字符集。隨著Unicode被主流操作系統(tǒng)和應(yīng)用程序所接受,需要改進(jìn)版本的Asc和Chr函數(shù)已經(jīng)開發(fā)了。為了滿足這種需求,針對(duì)Windows系統(tǒng)的Microsoft Visual Basic(4.0以及更高版本)包括了AscB、ChrB和AscW、ChrW函數(shù)。
Unicode是一種為代替ANSI標(biāo)準(zhǔn)而設(shè)計(jì)的,把字符編碼成數(shù)值形式的標(biāo)準(zhǔn)。因?yàn)锳NSI標(biāo)準(zhǔn)只使用單個(gè)字節(jié)來(lái)代表每個(gè)字符,它受最大256個(gè)字符的限制。雖然這對(duì)于英語(yǔ)受眾來(lái)說(shuō)已經(jīng)足夠,但當(dāng)考慮到全球軟件市場(chǎng)時(shí),它無(wú)法滿足。使用Unicode標(biāo)準(zhǔn),每個(gè)字符由兩個(gè)字節(jié)表示,因此整個(gè)的Unicode字符集包括了65536個(gè)可能的位置。
微軟的Windows NT, Windows 2000, and Microsoft OLE 2.0完全基于Unicode設(shè)計(jì),而且Visual Basic(4.0以及更高版本)在內(nèi)部使用Unicode格式來(lái)表示所有的字符串。AscW和ChrW函數(shù)允許對(duì)Unicode字符的全范圍訪問(wèn)。這些函數(shù)和原始的Asc、Chr函數(shù)運(yùn)行方式相同,唯一的區(qū)別在于新函數(shù)支持0到65536的參數(shù),而原來(lái)的只能是0到255。許多Visual Basic對(duì)象(例如調(diào)試窗口、標(biāo)簽、文本框),當(dāng)它們不知道怎樣顯示一個(gè)Unicode字符時(shí),會(huì)返回一個(gè)“?”。
因?yàn)樗械淖址F(xiàn)在在內(nèi)部由Unicode格式表示,它不像以前表示一個(gè)字符串里的二進(jìn)制數(shù)據(jù)那樣簡(jiǎn)單。使用Chr函數(shù)來(lái)分配數(shù)據(jù)給一個(gè)字符串的結(jié)果不再向以前一樣。例如:
stringvar = Chr(65)
結(jié)果是一個(gè)兩字節(jié)長(zhǎng)的字符串,其中第一字節(jié)的值為65,第二字節(jié)的值為0(這是Unicode表示的字母“A”)。需要記住的是,從ANSI轉(zhuǎn)換至Unicode并不總是意味著像這個(gè)例子里做的那樣,僅僅添加一個(gè)值為0的第二字節(jié)。例如,大多數(shù)在130~159范圍內(nèi)的ANSI字符碼擁有完全不同的Unicode值。嘗試運(yùn)行’Debug.Print AscW(Chr(130))’,然后一個(gè)8218的值會(huì)顯示出來(lái)。
當(dāng)前,windows系統(tǒng)需要一個(gè)“小端序(Little-Endian)”的處理器,意味著對(duì)于多字節(jié)數(shù)據(jù)中,最低有效位是存儲(chǔ)在第一字節(jié)處,其他的依次出現(xiàn)在后面字節(jié)。這解釋了為什么Unicode字符"A"在內(nèi)部如下表示:
------------------- | 65 | 0 | ------------------- byte 0 byte 1
AscB和ChrB函數(shù)可用于代替那些原來(lái)由Asc和Chr函數(shù)完成的功能,因?yàn)檫@些函數(shù)允許操作單個(gè)字節(jié)量。如果你想要一個(gè)4字節(jié)的連續(xù)地有二進(jìn)制值65、66、67、68的字符串,那么使用Chr函數(shù)不起作用。你必須使用ChrB函數(shù)代替。例如:
stringvar = ChrB(65) & ChrB(66) & ChrB(67) & ChrB(68)
或者,你可以使用創(chuàng)建新字節(jié)數(shù)據(jù)型的數(shù)組并且用這種方法操縱你的二進(jìn)制數(shù)據(jù)。
下面列出的是對(duì)一些簡(jiǎn)單使用這些函數(shù)的結(jié)果的解釋以便深入闡明這個(gè)信息。
Print Asc(Chr(255)) –> "255"
這里沒(méi)有什么新奇的,除了Chr函數(shù)返回一個(gè)占據(jù)兩字節(jié)的Unicode字符而不是一個(gè)一字節(jié)的ANSI字符外。
Print Asc(ChrB(255)) –> 5 –無(wú)效的過(guò)程調(diào)用
這個(gè)使用返回了一個(gè)錯(cuò)誤因?yàn)锳sc函數(shù)總是期待至少2個(gè)字節(jié)的參數(shù)但是ChrB函數(shù)僅僅返回一個(gè)字節(jié)。
Print Asc(Chr256)) –> 5 –無(wú)效的過(guò)程調(diào)用
盡管Chr函數(shù)返回一個(gè)兩字節(jié)的Unicode字符,它還是只能使用0到255的數(shù)字作為它的參數(shù)(注意,在一個(gè)支持DBCS的系統(tǒng)中,Asc/Chr處理兩字節(jié)DBCS字符,轉(zhuǎn)換它們?yōu)閁nicode)。使用ChrW函數(shù)允許對(duì)全部65536個(gè)字符地址的訪問(wèn)。
Print AscW(ChrW(256)) –> "256"
這是本部分第一段所說(shuō)的新版本。ChrW函數(shù)接受從0到65536的參數(shù),且返回那個(gè)字符(在32位系統(tǒng)中)。AscW函數(shù)解釋這個(gè)兩字節(jié)的字符為一個(gè)Unicode字符并返回正確的Unicode值。
Print Asc(ChrW(256)) –> "65" Print Asc(ChrW(5000)) –> "63"
這里發(fā)生的是,ChrW函數(shù)首先計(jì)算。ChrW(256)是字符"A",所以這個(gè)函數(shù)簡(jiǎn)化為Asc("A"),而Unicode(和ANSI)對(duì)應(yīng)"A"的數(shù)字是65。因?yàn)閂B不知道怎樣顯示用Chr(5000)表示的字符,它就顯示了一個(gè)"?",而正如所期待的,Unicode和ANSI對(duì)應(yīng)"?"的值為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"
所有這些返回的值能夠通過(guò)理解每個(gè)字符在內(nèi)部如何表示來(lái)解釋(看上面提到的小端序),并且由于那個(gè)事實(shí),即AscB函數(shù)只看它接收的字符的第一個(gè)字節(jié)。直觀來(lái)說(shuō),它看起來(lái)像如下圖表:
------------------- 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函數(shù)僅返回任何字符的第一個(gè)字節(jié)。
Print ChrB(65) –> ""
Visual Basic對(duì)這個(gè)對(duì)ChrB函數(shù)的調(diào)用什么都不顯示,因?yàn)镃hrB函數(shù)僅返回一個(gè)一字節(jié)的字符串。像這樣的一個(gè)字節(jié)的字符串對(duì)Visual Basic毫無(wú)意義,因?yàn)樗鼈儾粯?gòu)成一個(gè)有效的Unicode字符(或者一系列字符)。
Print ChrB(65) & ChrB(0) –> "A"
在這個(gè)例子中,我們把兩個(gè)一字節(jié)的字符串連接成為一個(gè)單獨(dú)的兩字節(jié)的字符串。由于生成的位模式和Unicode的"A"一樣的,那就是Visual Basic輸出的東西。
- office課程播放地址及課程明細(xì)
- Excel Word PPT Access VBA等Office技巧學(xué)習(xí)平臺(tái)
- 將( .accdb) 文件格式數(shù)據(jù)庫(kù)轉(zhuǎn)換為早期版本(.mdb)的文件格式
- 將早期的數(shù)據(jù)庫(kù)文件格式(.mdb)轉(zhuǎn)換為 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 數(shù)據(jù)庫(kù)引擎和訪問(wèn)連接引擎以阻止對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的訪問(wèn)(remote table)
- Access 365 /Access 2019 數(shù)據(jù)庫(kù)中哪些函數(shù)功能和屬性被沙箱模式阻止(如未啟動(dòng)宏時(shí))
- Access Runtime(運(yùn)行時(shí))最全的下載(2007 2010 2013 2016 2019 Access 365)
- access vba代碼太長(zhǎng),換行,分行的寫法
- VB6 VBA Access真正可用并且完美支持中英文的 URLEncode 與 URLDecode 函數(shù)源碼
- 自定義VB中的urlencode函數(shù),將URL中特殊部分進(jìn)行編碼
- Access 函數(shù)簡(jiǎn)化串接sql字符串,減少符號(hào)導(dǎo)致的書寫錯(cuò)誤
- vba完全關(guān)閉IE瀏覽器及調(diào)用IE瀏覽器的簡(jiǎn)單應(yīng)用
- 利用FollowHyperlink方法打開超鏈接提示“無(wú)法下載您要求的信息”的解決方案
- 在access中用代碼打開文本框中超鏈接地址
- Activex控件或Dll 在某些電腦無(wú)法正常注冊(cè)的解決辦法(regsvr32注冊(cè)時(shí)卡住)
- office使用部分控件時(shí)提示“您沒(méi)有使用該ActiveX控件許可的問(wèn)題”的解決方法
- RTF文件(富文本格式)的一些解析
- Access樹控件(treeview) 64位Office下出現(xiàn)橫向滾動(dòng)條不會(huì)自動(dòng)定位的解決辦法
- Access中國(guó)樹控件 在win10電腦 節(jié)點(diǎn)行間距太小的解決辦法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 樹控件 ListView列表等64位MSCOMMCTL.OCX控件下載
- VBA或VB6調(diào)用WebService(直接Post方式)并解析返回的XML
- 早期PB程序連接Sqlserver出現(xiàn)錯(cuò)誤
- MMC 不能打開文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一個(gè)MMC控制臺(tái),或者用后來(lái)的MMC版
- sql server連接不了的解決辦法
- localhost與127.0.0.1區(qū)別
- Roych的淺談數(shù)據(jù)庫(kù)開發(fā)系列(Sql Server)
- sqlserver 自動(dòng)備份對(duì)備份目錄沒(méi)有存取權(quán)限的解決辦法
- 安裝Sql server 2005 express 和SQLServer2005 Express版企業(yè)管理器 SQLServer2005_SSMSEE
聯(lián)系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |