VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函數之間的區彆
- 2020-10-27 08:00:00
- Demon 轉貼
- 4678
多年來,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輸齣的東西。
- office課程播放地址及課程明細
- Excel Word PPT Access VBA等Office技巧學習平颱
- 將( .accdb) 文件格式數據庫轉換爲早期版本(.mdb)的文件格式
- 將早期的數據庫文件格式(.mdb)轉換爲 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 數據庫引擎和訪問連接引擎以阻止對遠程數據庫的訪問(remote table)
- Access 365 /Access 2019 數據庫中哪些函數功能和屬性被沙箱模式阻止(如未啟動宏時)
- Access Runtime(運行時)最全的下載(2007 2010 2013 2016 2019 Access 365)
- Activex控件或Dll 在某些電腦無法正常註冊的解決辦法(regsvr32註冊時卡住)
- office使用部分控件時提示“您沒有使用該ActiveX控件許可的問題”的解決方法
- RTF文件(富文本格式)的一些解析
- Access樹控件(treeview) 64位Office下齣現橫曏滾動條不會自動定位的解決辦法
- Access中國樹控件 在win10電腦 節點行間距太小的解決辦法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 樹控件 ListView列錶等64位MSCOMMCTL.OCX控件下載
- VBA或VB6調用WebService(直接Post方式)併解析返迴的XML
- 早期PB程序連接Sqlserver齣現錯誤
- MMC 不能打開文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由於文件不存在,不是一箇MMC控製颱,或者用後來的MMC版
- sql server連接不瞭的解決辦法
- localhost與127.0.0.1區彆
- Roych的淺談數據庫開髮繫列(Sql Server)
- sqlserver 自動備份對備份目録沒有存取權限的解決辦法
- 安裝Sql server 2005 express 和SQLServer2005 Express版企業管理器 SQLServer2005_SSMSEE
聯繫人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |