最爱白菜

不登高山,不知天之高也;不临深溪,不知地之厚也。(《荀子》) ◆◆最爱白菜◆◆

原创 Unicode vs Ansi 收藏

以前都是只知道这样用,没仔细想过到底为什么要这样用.刚好碰到篇文章,解释了某些我以前在概念上不大清楚的内容,呵!对我有用就得了,我想大侠的话,你就没必要看这篇文章了吧!原文如下:

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)
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 精确定位的例子之外,纯文字的处理基本上是用不到 byte
array 的。byte array 通常是用在处理 binary 资料

发表于 @ 2004年07月22日 15:15:00|评论(loading...)

新一篇: MercuryInteractive WinRunner v7.60.03 完全版 (破解) | 旧一篇: .NET 框架与多线程 (转载)

用户操作
[即时聊天] [发私信] [加为好友]
最爱白菜
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
最爱白菜的公告
最近状态:认认真真做事,踏踏实实做人!

【个人简介】:
网名:最爱白菜/鸽子/海底捞月
loadingthink#hotmail.com
来自:云南昆明

【这里的文章部分来自于网上收藏,纯属个人学习爱好行为,别无它意,如果你觉得侵犯了你的版权,我可以尽快更改过来】
文章分类
收藏
BLOG邻居
"小灰"的专栏
Another's story
CN-Bruce's Blog
griefforyou的程序人生
limodou学习记录 (Python)
LW549 的BLOG
分享Java快乐
沁竹的BLOG
深空的 PHP/Java 人生
编程手札
装配中的脑袋
轻灵自由的珍珠
阿好空间
阿赖.COM @CSDN BLOG
创业杂谈
管理资讯
阿里巴巴以商会友
阿里巴巴创业社区
阿里巴巴创业论坛
名家收藏
【孟子E章】的专栏
-=NetBee=-的学习手记
ASP FAQ
ITPUB论坛
Kaneboy的Blog
Powerful ASP Components
study-area
уαуυ's НОМБ
中国E书网 (强荐)
中国XML论坛
中国标准XML
中国龙
代码中国
侯捷网站
冰云@Blogging
蓝蚂蚁工作室
迷失网络
透明思考
特别收藏
文件名信息数据库
网上生活
.NET 247 (类/命名索引)
※Office中国※
Ari--孤独的狙击手
CSDN.NET 技术中心
dll文件大全
Eclipse - 赛迪网
Flier's Sky
http://www.findlaw.cn/
http://www.iteer.net/
IT之源
Microsoft .Net 框架 SDK 快速入门
MSDN 中文网站
Oracle 中国技术网
ORACLE中国用户讨论组
Oracle技术网
O'Reilly's CD bookshelf
Python 编 程 论坛
Python中文社区
Regular Expression Library
UMLChina
vvsoft.COM 中文FTP
W3Schools Online Web Tutorials
web 开发技术荟萃
中国DotNet俱乐部
中国标准XML
中国系统分析员
中国经理人网
中文Zope用户组
亚商文档网
亚太国际管理训练中心
微软中文新闻组列表
微软亚洲技术社区
微软技术
微软高级培训论坛
找法律网(FindLaw.cn)
无忧脚本
法规检索
破釜沉舟
软件工程专家网
存档
软件项目交易
Csdn Blog version 3.1a
Copyright © 最爱白菜