当前位置:编程学习 > VB >>

Unicode vs 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 past

end 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)

补充:软件开发 , Vb ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,