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

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


你的钱被洗劫了么!APP安全问题来袭 10大最常见的数据库安全问题 南航微信服务号是如何炼成的? 超40项功能改进,虚幻引擎4.5正式发布! 【工具推荐】ER:可轻松构建一站式AJAX Web应用的开发框架 GraphLab:将大数据分析从理念运用到生产 支持Android 5.0:完全用Ruby的Ruboto框架迎1.2.0更新! 万物互联第一步:采用AllJoyn技术的智能硬件 【专访】敏捷专家何勉:让测试成为拉动组织敏捷实施的力量 Docker与微软合作 支持Windows Server 企业号热问热答——来深圳微信开发者大会聆听一线讲师的实战分享 AngularJS 1.3.0正式发布 超光速发展! 学个痛快!十款不容错过的Swift iOS开源项目 HTML5:助力智能电视生态实现新跃迁 MDCC 2014移动开发者大会公布全部议程 求更密集!Apple Watch SDK将于11月正式开放 【答疑】微信开放平台开发者资质认证 专访Informatica亚太和日本区副总裁Murray Sargant:中国公司正考虑数据资产货币化 Facebook又开源:让iOS应用界面极致流畅的ASDK框架 一周消息树:盘点史上最具毁灭性的软件Bug 微信公众平台设备功能支持个人开发者接入 2014中国移动开发者大调查第三批获奖名单曝光 微信企业号上线,带你看看它的真面目! OpenStack Juno版本发布——支持Spark和NFV 【十问十答】对话Go语言开发团队 苹果要求、Android开始,64位时代真的来了! MDCC 2014产品与设计论坛:带你发现产品之美 Java开发者值得关注的7款新工具 助力国产移动产品出海,UCloud部署北美节点 Zack Parker:用EC2在Cotap上打桩 用卫生棉杀敌冲关!两个高中女生的创意游戏 无人回答的帖子,再发一次。up有分 快去微软件聊天室了,开聊了。 from表单中的参数无法传递? 急!急!急!急!急!我安装Visual studio 6.0中文版不能够成功,是什么原因?? 关于Oracle的数据类型问题? 请问在vc中怎样创建Outlook对象 关于Cable Modem,高手指点。 毕业论文怎么作??????????? 新手送分(解决即给分) 天生爱吃冰激凌! 江湖告急!!!!! 整理 FAQ 的时候 为什么 总是出现 贴子内没有这个人的回复!!!:xxxxx 如何删除一段时间的记录?????(兄弟们帮帮我) 关于 Treeview控件,请高手指教。 推荐好书 Borland Delphi 6 中文企业版哪里有免费下载????????????????????500分 ADO中同一个Connection打开的RecordSet个数有没有限制? 我请教一个关于恢复数据库的问题!!!急急 关于特殊字符的问题!!!!!!!!! 要同时以cascade风格显示10个MessageBox对话框,请问有无可能? 如何用windows2000收发传真? yangjf接分 ASP.NET如何调用mschart asp.net中利用owc10生成了一个EXECL文件,但是不知道如何控制字体大小,及单元格的边框 数据库问题,请高手指点。 本人基础较差,刚刚学习c++,请教一个简单问题!!!! 为什么从左侧树状菜单进入论坛显示时 所有的 情形都是2月28时的贴子状况 笔记本安装SQL Server 2000老出问题 CSDN邮件期刊用什么打开呀?? 怎样用java把数据库里读出来的数据按自己定义的格式写入一个word文件 请问高手,PB7窗口属性面版里的窗口颜色下拉列表中的自定义如何使用。我看到有四个custom,怎样设置,多谢。 关于j2ee服务器定位模式(Service Location pattern) 在网页中怎么样直接运行可执行文件? ORALCE中的首选身份证明的问题 Collections 添加元素,怎样指定添加的位置?我想添加到最开始。 关于字符串长度的问题,我想len("ab你好")=3,而不是等于4,即将虑大小写和数字的问题 listview中怎样根据key ,找到这个listItem 12台计算机要接入宽带,怎么实现?马上散分!!!!! 十万火急!ddvboy、daniel007、sweethzp大虾请进,用Epson-LQ1600K打印381*297工资条,使用QuickReport,选A3纸,预览正常,可平打印右 公共IP问题 把图片存进SQL中??? 看过深入浅出mfc的同志进来看一下。 CDC画图一问,在线等待,谢谢! CFileFind为什么列不出网上邻居的共享目录的文件? 散分的如施舍,似炫耀!接分的如祈求,似可怜! LINUX的播放器咋这么傻啊 如何将小数转成整数,请看例子: 请问哪里有处理微积分等数学运算的控件? sos!!!打包软件!!!! 请问C++编程思想第二版有中文电子版吗? 一个困扰了我很久的问题,关于用BDE连SQL SERVER,请大侠请教? 单位受力面积是谁吗意思?新上物理它给了这么个定义,单位受力面积的质量为压强.解释一下到底什么意思,我最迷惑的就是‘单位’是谁吗意思,这一句怎么就可以表示,压强的公式P=F/S,高手解 位于长江上游的大型水利枢纽A小浪底B葛洲坝C三峡D丹江口 地球轨道为什么是椭圆的? 如果我站在半空不受地球引力影响的话,在中国一天后会在那里? 长江水能资源丰富,蕴藏量占全国的(),主要集中在()河段,建成了世界最大的()水利枢纽. 地球轨道是椭圆,太阳在一个焦点上,为什么没有在另一个焦点上也有一个太阳.这里地球和太阳泛指宇宙中同类星球.就是说为什么只有一个焦点有,另一个焦点没有星球?无 j假山好做吗 用向量自回归模型之前需要做ARCH异方差检验吗? 保险股票债券储蓄这四种那种是针对风险的投资方式,我说的是针对风险的投资,不是那种风险最大la 发现电磁感现象的物理学家是: 初一期末试题 还有 你们觉得地理难吗 我学得好困难 求助一元回归模型没有异方差是不是就意味着没有其他影响因素啊 奥斯特发现电磁现象的意义有人说奥斯特偶然撞到这个荣幸发现,你怎么看? 田园风光的作文应该怎么写? 细菌性感冒如何治疗 a、b、c 三个质点都在x轴上做直线运动,它们的位移-时间图象如图所示.下列说法正确的是( )A. 在0-t3时间内,三个质点位移相同B. 在0-t3时间内,质点c的路程比质点b的路程大C.质点a在时 怎样 写田园风光的作文 方差的公式 关于质点做匀速直线运动的位移——时间图象,下列说法正确的是 A.图线代表了质点的运动轨迹 B.图线的长度代表了质点运动的路程 C.图线必定是一条直线,其长度表示质点的位移的大小, 洗衣粉的说明书快 养细菌最好的办法是什么?... 染织企业生化池的细菌究竟怎么样可以养的最好.请大家给点意见 描写中华儿女报效祖国、为国争光的文章快,书籍也行 洗衣粉能杀死哪些细菌 基础化学(案例版)课后习题解答作者 席晓岚医学生用书 谁有描写中华儿女报效祖国.为国争光的文章别太长了 400字就够了 怎样用实验证明细菌被杀死?尽量用实验室的器材,并能说明相关步骤.我的实验是:什么物质可以杀菌。但不知道该物质和细菌接触后是否有杀菌抑菌的效果,所以才提供以上问题。求答案在 603《基础化学》 科学出版社,2006年6月 李保山主编 是哪一本书啊?第一版还是第二版. 描写中华儿女报效祖国,为国争光的文章, 关于我国工业的叙述,正确的是①我国最大的煤炭基地是陕西 ②京津唐地区煤、铁、石油等矿产资源丰富,是我国北方最重要的重工业基地 ③位于黄河流域的钢铁基地有包头、太原等 ④上海 P(k=x)=(ab^k)/k!且期望E(X)=2,求常数a,b. 铝合金 哪些铝合金不仅强度高质量轻适合做受力构件 比如做舷梯 我国棉纺织业,今后的技术发展方向是怎样的?对于棉花的品质要求会有怎样的转变? 在医疗中,我们一般用什么方法杀死细菌和真菌? 描写中华儿女报效祖国的文章!马上就写!读后感 西双版纳的人文地理云南西双版纳的气候环境好吗?做火车什么多长时间? 世界上没有两片相同的树叶 有感作文急用 如图所示为甲乙丙三个物体相对同一位置的位移图像,他们向同一方向开始运动,则在时间t0内,下列说法正确的A他们的平均速度相同B甲的平均速度最大C.它们的平均速率相等D乙和丙的速率相等 初二地理——云南的西双版纳有没有【黑熊】?到底有没有黑熊?我刚做了地理卷子上有一道选择题,老师对过答案【黑熊在林间觅食】是错的,这是为什么? 树叶的回音 感悟 高手进. 在线等.急~~~~~转眼就到了大四,大家就要天南地北地实习去了.离校那天,当我狼狈地拖着大大小小的行李走出宿舍楼时,我呆住了.班里的男生都在,他们是来送我的!男 如图2所示,A、B、C是三个质点同时同地开始沿直线运动的位移-时间图像,则在时间t2内A.A和B的平均速度相等B.B和C的平均速度相等C.B的速度最大D.它们的平均速度都相等 生态学模型建立的一般步骤以及一般方法是什么? 赏析、感悟:曲曲折折的荷塘上面,弥望的是田田的叶子.叶子出水很高,像亭亭的舞女的裙.层层的叶子中间曲曲折折的荷塘上面,弥望的是田田的叶子.叶子出水很高,像亭亭的舞女的裙.层层的 (双选)物体A,B的s-t图像(位移时间图像)如图所示,由图可知A、A.B两物体都在做匀加速直线运动B、A物体的运动速度大于B物体的运动速度C、两物体的同时从同一位置出发D、两物体的运动方向 无线电波是干什么的? 一片树叶 对生与死的感悟 是不是光的频率越高就穿透物体能力越强?声呢? 关于无线电波首先无线电波能传送数据吗?就是一些平时靠人工记录的数据,电脑记录然后通过无线电波发送出来.其次如果能传送接收,应该是不收费的吧? 扫描隧道显微镜是怎么清楚的探测物体表面的原子的? γ射线频率那么大,为什么穿透能力强?紫外线频率大,穿透能力弱,因为易发生折射和全反射.红外线频率小,穿透能力强,因为不易折射.不是频率越大越容易发生折射和全反射吗?穿透能力弱吗?为 茂密的树林可以阻挡沙尘暴,可以挡住洪水,还可以. 用扫描隧道显微镜才能观察到原子在固体表面的排列情况,可得出结论A原子是一个实心球体 B原子是静止不动的C原子是真实存在的肉眼是看不见的粒子 D原子空间有很大的空间 高二导数题.若作直线运动的物体在[t,t+△t]时间内位移的变化量△s=t3(△t)-3t2(△t)2-(△t)3若作直线运动的物体在[t,t+△t]时间内位移的变化量△s=t3(△t)-3t2(△t)2-(△t)3,则该 一个做直线运动的物体,某时刻的速度是10m/s,那么这个物体A.在着一时刻前0.1秒内的位移一定是1米B.从这一时刻起1秒内的位移一定是10米 C.从这一时刻起10秒嫩的位移可能是50米 D,如果从这一时 通过扫描隧道显微镜(STM) 能说明原子还可以再分吗 物理电磁效应 理论推导 BVq是啥E=BLV energy=BLVq F=energy/X=BLVq/X=BLXq/tX=BILBVq是啥 理论是啥 一个作直线运动的物体,某时刻的速度是10m每秒,那么这个物体在这一时刻之前的1s内的位移可能是10m是否正确 为什么在扫描隧道显微镜下的苯分子只能看到三个碳原子 引发尿路感染的细菌有哪些? 下大雨之后为什么会出现彩虹 什么是地球椭圆轨道? 山西大同浑源县回应:山体被挖处距悬空北京自住房摇号选房将出细则 京市户籍广东省应急委成员调整 朱小丹任主任\"不计划生育连饭碗都不给了?\"—(今日海外言论10月29日)军事手段欧洲西部多国遭飓风袭击 已致至少13摩洛哥举办中国电影周 《搜索》等7部美国华人不满ABC道歉 或采取更大规安倍出访土耳其 称海底隧道是日土友好澳维持禁止华为参与宽带网络项目 华为第二届世界浙商大会青田分会举行 共谋重读佛教经典 中国40位法师聚浙江杭侨乡青田将建进口商品贸易中心 搭建华部分赣南脐橙检出苏丹红 催熟染色成“江苏沛县官方回应办公楼超标:领导带头杰克逊私人医生穆雷提前出狱 歌迷不满湖南宁乡一村支书儿子结婚摆70桌 否学英语,寰球热度不减时尚盛宴:地铁变身麻豆T台秀场【高清美专家:美国悄悄丧失对华创新优势首届海内外青田人书画作品展开幕中国屌丝狂泡俄罗斯美女 普京都要哭了走进喀麦隆奴隶市场遗址十分吃惊,看看美国如何一招击碎黄粱美非理性暴跌,下周引爆千点大行情!向东传媒招聘快速致富——穷人缺什么71岁任正非:开车没速度我会不舒服一位老股民一直坚持简单实用的方法,从老刘对\"三安光电\"后期走势分析想蜜蜡鉴别:盐水测试法可靠吗?闭经后做试管婴儿成功几率大吗?中集集团严重低估了有望成为2016年外国留学生在威海南海新区植树为绿化献中国会费暴涨,美日却能一毛不拔!联合你的经历只是我的曾经,价值百万现货投盯住主力的一举一动 跟随主力必须掌握天茂集团严重低估了有望成为2016年中国须高瞻远瞩:认清美联储量化宽松狼小心有陷阱,国外买珠宝要注意的那些事走对一步,梦想近一步,选择大于努力\"分寸\":人生最难把握的两个字
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘