说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB中的Unicode 和 Ansi 格式

HTML文档下载 WORD文档下载 PDF文档下载
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 格式之间自由自在地变来变去,相信当您看完这篇文章之后,对处理中文应该不再烦恼了吧!


VB使用WriteFile 块读/写数据 VB使用枚举变量 VB使用数组做属性 VB使用未安装的字体 输入限制确认-VB资料 熟悉VB的集成开发环境 鼠标取词-VB资料 谈变VB中APP.PAHT的注意事项 探讨高效的排序合并算法-VB资料 剔除INI文件中的注释部分-VB资料 提取可执行文件中的图标-VB资料 添加记录到文档菜单-VB资料 突破 SendKeys 的限制-VB资料 突破SendKeys的限制 -VB资料 圖面背景透明的技巧-VB资料 退出并关闭 Windows-VB资料 托盘程序详解(二) -VB资料 托盘程序详解(一) -VB资料 我怎样确定我的程序是否在运行?-VB资料 无重复随机数序列产生器 -VB资料 显示打开方式对话框建立文件的关联 -VB资料 显示动画鼠标图标-VB资料 修复VB5启动时可能出现的一个bug 修改IE的环境菜单-VB资料 修改安装向导生成的缺省安装目录 -VB资料 修改屏保口令 -VB资料 修改屏幕保护的口令 -VB资料 旋转字体 -VB资料 延时函数-VB资料 一个关于乘法溢出问题的探讨 -VB资料 一组VB实用小程序 80分求救 C++Builder开发程序登录问题? 请问GridBagConstraints(有源码) 如何动态更换列表控件前面的小图标? 关于记录修改 用sdk编程怎样加入toolbar? table里的查询字段为什么不会显示数据? c#与interbase请教 C语言的大小问题都在这里面? 不要编译,你猜猜这个程序会有几个类型匹配的警告? 不要编译,你猜猜这个程序会有几个类型匹配的警告? 高分解问,请教高手!关天GIS! 如何判断窗体中的某个控件是textbox控件?或判断窗体中textbox的个数? 如何调用返回不定字段个数的存储过程 那里能找到rational rose 有关FORM与ACCESS数据库的连接 如何使用photoshop把图像缩小到指定大小? 关于某种文件关联的问题 为什么用net send发送的消息有关不掉,点了好多次确定也没用。 怎么保存到数据库中?急急急! 电脑出问题了。 tomcat4.01+apache2.046组合问题:单个的都能运行,...可以加分.. %u的问题 如何调整对话框上工具栏的状态 关于query控件的一个问题 如何结束一个线程? FastReport怎么将没有记录的地方也画上格子??? 我的oracle9装上去之后怎么有7。2G那么大??并且还连不上MANAGEMENT SERVER只能独立启动??请指教!! Fastreport与quickreport那个更好用? 进者有分. 强烈要求铲除全国所有的收容所!!! 要用什么软件才能将CMOS参数备份到某个文件夹中? 请问怎么在建表代码里定义关键字? 请问把数据写入ListView控件内,有什么办法可以快点? win2k server dns 求助! 我在易趣上竞的一个数码相机,只要250元,但是只能拍26张相。我不知道是真是假? 一个搞不定的恶意网站 cout与printf的问题 没有路由怎样用一台服务器实现300台左右的电脑上网? ResultSet里读出数据的参数问题,马上给分 netvt(唯她 v1.1.1),进来拿你应得的分 如果我的程序中用了VFP,但是用户可能并没有装VFP,有什么好的办法直接替用户解决了这个问题,而不是提醒他自己去装 怎么保存到数据库中?急急急! 我用treeview显示数据库的数据,增加一条新记录后,要怎么样才能马上在treeview显示? 无法传值问题,高手急救!!!!!!!!! 在线等待:怎么为datagrid控件的某一格赋值? 请教如何在input上传筐里面限制文件类型? java的图形设计比如swing有前途吗?大家来讨论下,迷惑中。。。 计算机静电问题!! 错误在那里 请教批量update出错问题 请问串口方面的? 耐磨橡胶衬板主要厂家有哪些? 邱少云在牺牲时夺取的是什么 近五年来,青蛙(田鸡)肉走上餐桌,假如人们大量捕杀这种农田中的青蛙.这样带来的后果是( ).“假如人们大量捕杀这种农田中的青蛙.”中的这种农田是指:水稻,稻螟虫,蚯蚓,蛇,蜜蜂,野 仿写句子如一朵鲜花,点缀不出绚丽的春天 一朵鲜花点缀不出绚丽的春天.仿造例子,再写一句,与其格式相同. cf潘多拉角色有什么优点,比起灵狐怎么样? 下图:三个直径相等的圆.求阴影部分的面积占一个圆面积的几分之几? 一朵鲜花点缀不出绚丽的春天仿写 邱少云哪年牺牲的? 雪松1年能张有多大?冠幅有2m吗? wp手机是什么? 西方管理思想产生的背景是什么? 横波只能在固体中传播是不是只是指在机械波的范畴内? 如图三个直径相等的圆阴影部分的面积占一个圆面积的多少 一个物体放在一个斜面上,这时物体对斜面有压力吗 写出描写战争的诗句或名言警句. 如右图:三个直径相等的圆.求阴影部分的面积占一个圆面积的几分之几 有些人爱吃蛙肉,为此便有人大量捕捉野生青蛙,这种做法会产生怎样的后果? 作为一个平时英语成绩113左右的高中生,雅思6.5两个月能冲到吗我现在急需雅思成绩,否则就要再等一年申请大学,英语底子没那么好,但是拼全力的话,两个月可以吗 爱因斯坦的相对论简单来说究竟是什么 有些人爱吃肉,为此便有人大量捕捉野生青蛙,这种做法会产生怎样的后果? 去年12月四级602 今年6月六级622 英语一直没有系统的学 基本上坚持看老友记 现在考雅思 过年前有机会7.5么 大家觉得WP系统手机的优点在哪? 圆O1的半径是2cm,圆O2的半径是5cm,圆心距是4cm,则两圆的关系是 A.相交 B.外切 C.外离 D.内切圆O1的半径是2cm,圆O2的半径是5cm,圆心距是4cm,则两圆的关系是A.相交 B.外切 C.外离 D.内切 请问雅思好考么?没有英文基础 两个月的时间 雅思能考到3. 你觉得手机WP操作系统怎么样最近喜欢上了WP操作系统 隐形飞机的隐形原理是什么?如何做到隐形? 紫荆 打一纺织词语 最新的WP手机操作系统怎么样,有什么新功能呀 隐形飞机为什么能隐形,的原理是什么? 十分徳法 打一纺织词语 金鱼是卵生还是蛋生如题 金鱼是过卵生还是蛋生抚养后代的 已知两个圆的半径分别为3cm和5cm,并且两圆没有公共点,则两圆的圆心距的取值范围是 水泥磨二仓衬板磨平了,影响产量吗 恐龙是怎样从我们的地球蛋生的呢? “有些人爱吃蛙肉,为此便有人大量捕捉野生青蛙,这种做法会产生怎样的后果? Φ3.2x13m 水泥磨三仓钢球级配 带2个负电荷的硫离子的化学式是什么 有些人爱吃蛙肉,为此便有人大量扑捉野生青蛙,这种做法会产生怎么样的后果 什么是水泥磨?水泥磨在安装试车时应该注意哪些事项? 综合知识抢答赛,答对一题加5分,答错一题扣2分.A学生共抢答了20道题,最后得分72分.他答对几道题? 那一天我忘不了 作文 最好的水泥磨厂家?水泥磨哪家好? 人生如絮,飘零在此万紫千红的春天.仿句例句:人生如絮,飘零在此万紫千红的春天.仿句:人生如————————人生如———————— 作文字数:500---600.. 什么是开路粉磨?什么是闭路粉磨?水泥开路粉磨和闭路粉磨的区别? 人生如絮,飘零在万紫千红的春天.相照应的句子 CF潘多拉好吗?我买了,到底有什么好处 怎样用几何图形来表示四字成语:一个三角形没个角里有一个圆 失根的兰花第⑩段中 人生如絮,飘零在此万紫千红的春天 应当怎么理解 人们大量捕杀青蛙会产生怎样的严重后果? 一句关于战争的名言急 人生如絮,飘零在这万紫千红的春天意思 大量扑抓青蛙,后果怎样? 堆焊耐磨板和铸造哪个好为什么堆焊耐磨行性能好能说的具体点嘛!谢谢~ 人生如絮 飘零在此万紫千红的春天 什么修辞 从跳高 等分析我主要玩JU 哪些单位需要堆焊耐磨板 如果人类停止生育,但能长生,这个世界会怎样?长生的感念是:小孩永远是小孩,年轻人永远是年轻人,老人永远是老人,但都没有死亡但出现车祸或别人杀害也就是=世界上就少了一个人例:100-1=99, 如果大量捕杀青蛙,你觉得会造成怎样的后果.简答,100字以内. 美参议院情报委员会主席:白宫将停止监韩国向美国求证是否监听朴槿惠 美方尚伊朗和国际原子能机构继续就伊核问题对郎朗被任命为联合国和平使者 成第二位西班牙对美国监听表不满 闭门召见美大墨西哥自2001年以来首现霍乱疫情 美国在罗马尼亚部署反导系统 巩固在黑卜拉希米访叙将劝反对派统一组团参加日暴风袭击西欧大部致德国七人死亡 英法以色列将释放第二批26名在押巴勒斯坦印媒:印度调整中国战略因不喜欢给中国英首相:媒体爆料美监听丑闻是“资敌”韩国向美国求证是否监听朴槿惠 美方尚12岁黑客入侵加拿大政府网站 辩称仅《纽约时报》著名专栏作家托马斯:上海被控杀死杰克逊者出狱 称为谋生计想当圣马力诺执政官会见王毅王毅同圣马力诺外长瓦伦蒂尼会谈美国对监听国家分“三六九等”纽约手机可接收紧急警报韩国向美国求证韩总统是否遭窃听 但美佛高区核心区升级为省“智能制造示范基国庆每天推出10套特价房,中信惠州三高新技术产品开始申报认定大沥强拆近两千平米违建1 8月重点项目累计完成投资268亿涉农产业创业创富大赛3支队伍晋级十一长假新会旅游进账2 .35亿准提远眺暂不见 游人香客脚步勤外来客 本地房9月菜价领涨 苦瓜价升近三成中山将建3个市级社工培育基地货车撞死一人 司机逃逸周六去听无伴奏四重唱音乐会西区妇联携手商会资助困境儿童家庭陈村“爱心饭堂”为39位长者送餐过去16年约六成副市长由县区书记直升7月海洋水质监测点都达标整治不能放过非法改装禅南新增公交线路172今日上路双城生活纠缠17年 100亩山地到底是谁的?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘