<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛艷小屋

    程序--人生--哲學___________________歡迎艷兒的加入

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
    VB中的Unicode 和 Ansi 格式

    Visual Basic 32-bit 版本的字串處理采用 Unicode,也就是說字串在 VB 內部是以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,

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

    posted on 2006-06-29 16:54 天外飛仙 閱讀(1829) 評論(1)  編輯  收藏 所屬分類: .net

    Feedback

    # re: VB中的Unicode 和 Ansi 格式 轉換 2012-12-22 16:56 4
    Debug.Print InStrB(sAnsi, StrConv("上海市", vbFromUnicode)) ' 返回 26
    ?  回復  更多評論
      

    主站蜘蛛池模板: 亚洲人成依人成综合网| 免费黄色网址入口| 亚洲国产成人久久综合一区| 日韩亚洲欧洲在线com91tv| 免费人成网上在线观看| 巨胸喷奶水www永久免费| 十九岁在线观看免费完整版电影| 一级成人a毛片免费播放| 日韩欧毛片免费视频| 四虎永久成人免费影院域名| 国产亚洲人成网站在线观看不卡| 久久综合亚洲色HEZYO社区| 最新亚洲精品国偷自产在线| 一级做a爱过程免费视频高清| 久视频精品免费观看99| 亚洲裸男gv网站| 国产男女猛烈无遮挡免费视频| 国产亚洲精品精品国产亚洲综合 | 日韩成人免费在线| 亚洲乳大丰满中文字幕| 亚洲一区AV无码少妇电影| 一个人免费视频观看在线www| 成人AV免费网址在线观看| 国产亚洲AV无码AV男人的天堂| 亚洲精品美女久久7777777| 亚洲午夜免费视频| 亚洲老妈激情一区二区三区| 无码一区二区三区亚洲人妻| 免费99精品国产自在现线| 亚洲综合久久1区2区3区| 国产精品午夜免费观看网站| 免费无码一区二区三区蜜桃大 | 免费观看的毛片手机视频| 亚洲国产精品综合久久网各| 国产成人无码a区在线观看视频免费| 日日麻批免费40分钟无码| 亚洲AV永久无码区成人网站| 中文字幕免费在线视频| 国产精品亚洲综合专区片高清久久久 | 美女被爆羞羞网站免费| 国产免费av一区二区三区|