VB中的Unicode 和 Ansi 格式 (轉)
VB中的Unicode 和 Ansi 格式
32-bit 版本的字串處理採用 Unicode,也就是說字串在 內部是以Unicode
的格式來存放。
何謂 Unicode?簡單的說,就是每一個字元都是以 2-byte 的形式表示,而每個「實體字元」
就是一個「字元」。因此,
Len("大家好")
Len("abc")
所返回的值都是 3,因為「大」和「a」都是一個字元。
但是這對一些中文字串處理,例如純文字的資料,卻是一個大災難,因為你必須以byte
來定位每個字元,可是 Unicode 卻把一切的處理全搞砸了。例如:
Len("Good Morning") 返回 12,而
Len("今天天氣很好") 返回 6
對初學者而言,好不容易能使用 VB 來寫已經是件了不起的事了,卻馬上在中文處理上
捱了一記悶棍,所受到的打擊實在不小。但是不要怕,事實上只要再多瞭解一些指令,就可
以把中文處理的問題解決了。
是什麼指令呢?最重要的莫過於 StrConv 了。StrConv 的語法為:StrConv(待轉換字
串, 轉換格式)
其中轉換格式在這裡用到的是:
vbUnicode 將 Ansi 字串轉換為 Unicode
vbFromUnicode 將 Unicode 字串轉換為 Ansi
將字串轉成 Ansi 之後,所有的字串處理指令都要加個 B,例如:LeftB, RightB,
Mi, ChrB, InstrB, LenB, InputB 等。例用這些指令來處理就行了。
當你處理完畢之後,你可以再將它再轉回 Unicode,這樣就可以使用一般的字串處理指令了。
這樣講看得懂嗎?如果還是不瞭解,看看下面的例項說明:
簡易使用範例
看看下面的基本範例您應該就會對 VB 的字串處理方式有些概念。
Private Sub Command1_Click ()
Dim sUnicode As String
Dim sAnsi As String
' Unicode 運算
sUnicode = "王小明,A123456789,651023,上海市中山路100號,(02)2345678"
De.Print Len(sUnicode) ' 返回 44
Debug.Print Mid$(sUnicode, 5, 10) ' 返回 A123456789
Debug.Print Instr(sUnicode, "上海市") ' 返回 23
' 將 Unicode 字串轉成 Ansi
sAnsi = StrConv(sUnicode, vbFromUnicode)
' Ansi 運算
Debug.Print LenB(sAnsi) ' 返回 54
Debug.Print MidB$(sAnsi, 8, 10) ' 返回 ?????,因為忘了轉回 Unicode
Debug.Print StrConv(MidB$(sAnsi, 8, 10), vbUnicode) ' 返回 A123456789,請注意轉
回 Unicode 的動作一定要做
Debug.Print InStrB(sAnsi, StrConv("上海市", vbFromUnicode)) ' 返回 23, 不要忘了
要把"上海市"也轉成 Ansi,否則會找不到
End Sub
讀入文字檔案
在 VB 的小技巧中,有一個是讀檔案法:
Private Sub Command1_Click ()
Dim ile As String
Open "C:filename.txt" For Input As #1
sFile = Input$(LOF(1), #1)
Close #1
End Sub
但是很不幸地,如果你讀取的檔案內含中文字,那上面這段程式會出現 Input pastend of
file 的錯誤。因為 LOF 返回的是檔案的 byte 數,而 Input 函式讀取的是字元數,由於
檔案內含中文,因此檔案中的字元數將會小於 byte 數,於是就發生錯誤了。
要解決這個問題,我們就要用到 StrConv 和 InputB 這兩個函式了:
Private Sub Command1_Click ()
Dim sFile As String
Open "C:filename.txt" For Input As #1
sFile = StrConv(InputB$(LOF(1), #1), vbUnicode)
Close #1
End Sub
上面修正程式先用 InputB 將檔案讀進來,不過使用 InputB 所讀入的檔案是 Ansi格式的,
所以要再用 StrConv 轉成 Unicode 才行。
隨機資料檔案
許多文字資料檔案是以固定位元組的位置來加以區格,例如下面的資料格式:
王小民650110上海市中山路100號 (02)1234567
張大呆660824花蓮縣大甲鎮廣東街23號(03)9876543
......
像這種型別的檔案要如何處理呢?這是就必須用到 Type 以及 byte array 了。
Private Type tagRecord
Username(5) As Byte ' 姓名 6 bytes
Birthday(5) As Byte ' 生日 6 bytes
Address(21) As Byte ' 地址 22 bytes
TEL(11) As Byte ' 電話 12 bytes
CrLf(1) As Byte ' 換行字元 2 bytes
End Type
Private Sub Command1_Click()
Dim uRecord As tagRecord
Open "C:filename.dat" For Ran As #1 Len = LenB(uRecord)
Get #1, 2, uRecord ' 取第二筆資料
With uRecord ' With ... End With 應該會用吧
Debug.Print .Username ' 返回 ???
Debug.Print StrConv(.Username, vbUnicode) ' 返回 "張大呆"
End With
Close #1
End Sub
在這個例子中,一定要用到 byte array,因為只有 byte array 才能正確地定位到每個 byte
的位置。以前使用字串來定位的方法已經不適用了,千萬要記住!但是使用byte array 所
讀入的資料是 Ansi 格式,若要處理或是做運算的話,記得還要轉成Unicode 格式才行。
[●] 使用 Byte Array
除了上面必須使用 byte 精確定位的例子之外,純文字的處理基本上是用不到 bytearray
的。byte array 通常是用在處理 binary 資料。這方面的問題我們將另文討論。
看吧!只要熟悉使用 StrConv,你就可以在 Unicode 及 Ansi 格式之間自由自在地變來變
去,相信當您看完這篇文章之後,對處理中文應該不再煩惱了吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988816/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ string互轉wstring/Unicode互轉ANSI/Unicode互轉UTF8C++Unicode
- python實現中文和unicode轉換PythonUnicode
- Unicode編碼和中文互轉(JAVA實現)UnicodeJava
- unicode轉碼工具類Unicode
- 從 unicode 到位元組的轉換Unicode
- 使用C#,VB和Java將PDF轉換為DOC / DOCXJava
- [SSL證書].pfx格式和.Cer格式的區別以及格式互相轉換
- C#/VB.NET 在Excel單元格中應用多種字型格式C#Excel
- C#/VB.NET 實現Word和ODT文件相互轉換C#
- JAVA中GBK格式檔案和UTF-8格式檔案互相轉換Java
- Jmeter json格式 unicode亂碼現象解決方法JMeterJSONUnicode
- python 在windows cmd中顯示彩色的字串(無第三方庫,用ANSI轉義)PythonWindows字串
- unicode和UTF-8的區別Unicode
- OPC Server示例教程:VC#和VB.NET中的簡單APIServerAPI
- C++ UTF8 互轉 UnicodeC++Unicode
- python中怎樣指定open編碼為ansiPython
- 中文字串 轉 unicode 編碼的字串字串Unicode
- 在matlab中如何將圖片(png和jpg)轉成mat格式Matlab
- 如何理解 python UnicodeEncodeError 和 UnicodeDecodeError :python 的 string 和 unicodePythonUnicodeError
- C#/VB.NET 將RTF轉為HTMLC#HTML
- C#/VB.NET 將Html轉為ExcelC#HTMLExcel
- Java 將Excel轉為et和ett格式JavaExcel
- Python字典格式與JSON格式的相互轉換PythonJSON
- csv格式怎麼轉換成excel?csv格式轉換成excel格式檔案的方法Excel
- C#/VB.NET 將彩色PDF轉為灰度C#
- [時間格式的轉換]
- C#移除字串中的不可見Unicode字元C#字串Unicode字元
- ABAP和XML資料格式互相轉換的兩種方式XML
- freac for mac音訊和CD格式轉換器Mac音訊
- .pfx格式證書轉.key和.crt檔案
- 如何給視訊格式的檔案進行格式轉換 可以轉為音訊格式嗎?音訊
- Unicode的前世今生Unicode
- unicodeUnicode
- 將網址url中的引數轉化為JSON格式JSON
- 一招教你heic格式批量轉換png,必會的格式轉換!
- C#中,時間格式轉化,ticks,datetimeC#
- Managed C++: Another VB, or VB.NET, or WhateverC++
- yaml 檔案裡的中文,以 json 格式請求抓包為什麼是 unicodeYAMLJSONUnicode
- Python 實現Excel和TXT文字格式之間的相互轉換PythonExcel