VB中的Unicode 和 Ansi 格式

2021-04-08 18:41:53 字數 3429 閱讀 2943

vb中的unicode 和 ansi 格式

visual basic 32-bit 版本的字串處理採用 unicode,也就是說字串在 vb 內部是以unicode 的格式來存放。何謂 unicode?簡單的說,就是每乙個字元都是以 2-byte 的形式表示,而每個「實體字元」就是乙個「字元」。因此,

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,

midb, 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"

debug.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 sfile 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 random 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 格式之間自由自在地變來變去,相信當您看完這篇文章之後,對處理中文應該不再煩惱了吧!

VB中Unicode的轉換

vb本身的字串格式就是unicode,用winsock傳送字串的話,會預設把字串轉換為ansi的格式進行傳送。ansi格式,對於英文符號等仍然使用單位元組,漢字使用雙位元組。如果需要進行轉換的話,可以用strconv來進行。如 dim bytefilename as byte bytefilenam...

Matlab中的ans小結

一 什麼是ans ans 是matlab中預設的結果變數.每次matlab進行運算後,結果都要儲存在指定的變數中.如果你只是輸入表示式,卻不指定把表示式的運算結果儲存在那個變數裡面,那麼matlab就自動地將結果儲存在ans變數中.直到下一次不帶指定儲存變數的運算結束前,ans中所儲存的值不變.因此...

VB 如何讀出unicode編碼的txt檔案內容

其實,這個問題很簡單 可偏偏很多人不知道,於是寫了這個 先用2進製方式開啟檔案,讀出資料到byte陣列中,然後用copymemory去掉檔案頭 頭兩個字元分別是ff fe 16進製制 得到乙個新的byte陣列,最後利用strconv函式即可,下面給出 option explicit private ...