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

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应用程序中的工具提示和状态显示 VB中处理长列表框项的两种方法 VB中多级下拉列表的实现 VB中防止将重复项目添加到列表框控件中 VB中实现菜单分割 VB中实现带预览的对话框 VB中实现同一窗口的多个实例及控件的动态增减 VB中阴影字体的实现 VB自定义数据结构的传输转换 Visual Basic 窗体背景花纹的实现 Visual Basic 中的界面设计原则和编程技巧 Visual Basic 中文本框处理技巧集萃 Visual Basic 中字符淡出淡入的实现 Visual Basic窗体背景花纹的实现 Visual Basic下工具条的制作 Visual Basic中的界面设计原则和编程技巧 Visual Basic中在同一界面输入大量数据的几种方法 VisualBasic中的界面设计原则和编程技巧 VisualBasic中用户界面的设计原则 把 VB 标准的工具栏变成平面式 把窗体卸载干净-VB资料 保持初始的窗体大小-VB资料 编程实现将所有窗口最小化-VB资料 不规则形状窗口详细说明 -VB资料 不用 API ,直接调用关联的程序 -VB资料 处理过程时的鼠标显示 -VB资料 窗口处理技巧大全 -VB资料 窗口事件的发生顺序-VB资料 VB创建不规则窗口 VB创建透明窗体 VB创建位图菜单 大侠执教:投稿程序员杂志要多少时间才有回音? 有办法在控制台程序启动时,隐藏它的DOS窗口吗? 关于MFC中的Project Settings问题 两个编程的初级问题 谁能给我一个关于二叉树的完整的程序。 认识的进来聊天 , 我是东宝 (yeti_lee) 我是一名学生,学计算机(一个普通大学)。请教大家几个问题 大连成绩如何查??有人查到了吗?请聊聊 分是个累赘,我放完它~!来的就有,讲些凄惨的事情和遭遇,大家比谁惨,越惨的给分越多,兄弟我此举是为了找平衡。 怎样得到当前系统打印机的各项信息?????特别是打印纸张方向!!! 高分求救——我有几道C程序的编程题目,望各位高手帮忙解决!谢谢 哪位告诉我select语法,我忘了group by 的使用方法,谢谢! 请问哪儿有电子版的《COM编程精彩实例》,谢谢! 请问:要想学习vb和数据库的知识,哪些书比较好?请各位朋友帮忙推荐几本好书?谢了~! 请问有谁知道PB8编译后打包,PARADOX数据库驱动程序需那些啊????急!!!!!! 在oracle存储过程中怎么使用cursor作为返回值? [TIPS]Win9x和WinNT/2000下面都可以去掉OICQ广告的方法! 触发器问题 关于bdgrid的问题,高手请来,一定高分相送!!!!急 怎么建立WIN2000的域信任关系 用data控件连接DBf数据库时为什么出现“找不到可插入的ISAM”错误? 大家等会儿再吃饭!先看一看这里的送分大餐...... 他们怎么想的?居然没有bcb? 高手指教:如何在vc中控制刻录机和磁带机进行数据备份和恢复? 请问各位高手,怎样才能学好c语言。有没有什么好一点的网站和源码提供,多谢。 如何解决在向量位图背景下的窗口移动是的刷新置后问题?? 问一个问题!爱好or 程序员? 用VB如何设计好的报表,欢迎讨论! messagedlg能不能显示中文?例如显示“确定”,而不是“ok” 各位高手!!请教一个有关在oracle8i中建立表与表之间的关系? 请问哪里有无时间期限的Setup Factory 下载? 笨呆呆,拿分。 请问到那里可以下载uml工具,如果再有推荐的话是一定可以得分的 再次有请: playyuer 吴文智、袁飞、Jneu、Amoon、ttyp、icevi、progame、Jinesc 等各路高手 偶是初学者,问一个问题 SOS,很严重windows的问题,高手快进 复制Access数据库时出现的问题 如何动态添加TQuery的字段??? 编译一问 SOS,很严重windows的问题,高手快进 !!! 有人开发过基于winpcap的网络抓包程序么? SOS,很严重windows的问题,高手快进 ! 通过双网卡上网怎么设置? 一名初学者的问题? 各位老大,如何控制windows的资源管理器显示/不显示后缀名 问一下现在4000元可以买到大概什么配置的笔记本电脑 谁知道用VC++直接操作硬盘?告诉我一声,多谢了 请问考OCP的12本宝典在哪里下载?有人能介绍介绍经验吗?谢谢! Nobody can help me? 去考MCSD我合格吗? 怎样让程序自动修改IE中htm文件? 高中历史必修一的复习提纲全部 求解释下列名词,1%100ml的葡萄糖溶液中1%是指什么、100ml是指溶剂水还是什么 在化学中的晶体和物理中的晶体是同一种吗?就是说化学里的晶体一定满足物理中的定义吗 19.某中学学生在课余探讨明清时期的“闭关锁国”政策时,得出了以下结论,其中正确的是( ).A.清朝时开放广州一处同外国通商,说明并不是真正“闭关锁国”B.“闭关锁国”这一政策产生的根 如右图所示,向烧杯内的溶液b中逐滴加入溶液a时,灵敏弹簧秤的读数先逐变小,然后又逐渐变大,则溶液a、b分别是A NaOH、H2SO4 B BaCl2、NaOHC BACL2 NA2SO4 D NH3・H2O、CH3COOH 物理上的晶体和化学上晶体的区别(初中上的)物理上说的晶体就是有一定熔点的,而化学上所谓晶体就是一种可溶物,溶于水后,降温或蒸干析出晶体.难道可溶物在溶解前就没有一定熔点,而 1.有人说洋务运动“无心插柳柳成荫”这里“柳”指的是什么?引进近代科学技术和出现新的经济因素和阶级力量为什么选后者?2.洋务运动有没有为资本主义发展开辟道路?为什么?3.中国近代资 白糖溶解与水形成糖水是物理变化还是化学变化 工业晶体盐的物理和化学特性是什么 高中历史必修二复习提纲 请问 初中历史和高中历史 有区别吗? 物理意义上的晶体是否与化学意义上的晶体相矛盾物理意义上的晶体指有固定熔点的物质而化学意义上的晶体指有规则集合几何外形的固体二者是否矛盾 (1)NaCl晶体融化时需要克服的作用力是_____… (2)NaCl晶体中,离子键的键长为____,Na+的半径与Clˉ的半径之比为______ (3)NaCl晶体的每个晶胞中有____个Na+,____个Clˉ.(4)As的价电子排布式为___ 一到化学题,解释为什么不选b我觉得二氧化碳和氢氧化钠反应了,那么试管的力的气体变少,那么在大气压的作用下,氢氧化钠就会上去. 全国初二会考地理都是开卷的吗? 由于预习阶段,有些概念还不懂,还请前辈们多多指教呢. 化学这题为什么选C求解释 昆山初二地理生物会考开卷吗 高中历史必修一复习提纲 人教版 请说明原因,我觉得它选B 09年长沙芙蓉区初二生物会考是不是开卷?如题..我听说地理MS是开卷... 融雪剂NaCl使冰雪融化是什么变化? 水能溶解五水硫酸铜吗 是什么变化物理还是化学 什么晶体要破坏共价键 融化氯化钠的颜色如果将氯化钠加热融化后是什么颜色的?氯化钠熔点800多度呢2l不可以吧 把什么物质分解是化学变化吗 知道的哥哥姐姐们,我怕升不上去,让我有个底,谢谢你们了. 化学有机选择题一题,麻烦详细讲解下,有图 全册的, 上海高中政治考是开卷还闭卷?RT NaCl熔化算不算化学键被破坏?为什么? 经典力学的主要内容是什么? 有没有开卷考? 熔化 溶化 融化 都有什么不同?熔化是一样的吗?溶化是一样的吗?融化 融解是一样的吗? 为什么熔融NaCl会破坏化学键?不太,不太明白, 高中历史:罗马法的核心内容及影响速度 材料一 天下多男人,尽是兄弟之辈;天下多女子,尽是姐妹之群,何得存此僵彼界之私,何可起尔吞我并之念.——洪秀全《原道醒世训》,1843年材料二 逆贼洪秀全杨秀清称乱以来,於今五年矣.荼 关于熔化时破坏化学键的一道题现有 1.氯化钡 2.金刚石 3.氯化铵 4.硫酸钠 5.干冰 6.碘片 一 熔化时不需要破坏化学键的是熔化时需要破坏共价键的是熔点最高的是 最低的是 二 属于离子化合 古代中国的名门望族多“以商贾兴,以官宦显”.该现象A.反映了商人政治地位的提高 B.是“工商食官”的表现 C.制约工商业扩大再生产D.反映了重农抑商观念的弱化\x05《英国文化模式溯源》中 谁有下面这个高中历史第一轮复习的文件? 融化时破坏的化学键 氯化氢 蔗糖 为什么融化不会破坏化学键?怎么判断融化会不会破坏化学键?还有怎么判断溶解破不破坏化学键?氯化氢不是共价键吗?完全搞不清楚. 下列物质中,含分子数目由大到小的顺序为()A 0.5mol氧气B 6.02*10^23个氮气C 6.02*10^24个HClD 与0.12kgC-12含相同原子数目的氯气 熔融 熔化 溶解区别是什么? NaCl溶解在水中时,化学键有没有断? 铁为什么能与水反应? 溶解和熔化有什么区别嬷?从化学角度咯,最好举例子嘞~ 盐撒在冰上,请问冰为什么能融化成水, 铁生锈是物理反应还是化学反应?为什么? 水落石出现一五十是什么生肖 磁流体是电子材料的新秀,它既具有固体的磁性,又具有液体的流动性.制备时将含等物质的量的FeSO4和Fe2(SO4)3的溶液混合,再滴人稍过量的氢氧化钠溶液,随后加入油酸钠溶液,即可生成黑色的、 请问铁矿石炼成铁是物理变化还是化学变化,为什么? 熔化和溶解有什么区别? 高中历史内容与初中联系大主要讲什么有必定接洽点然则高中汗青是从理论上开端分析初中纯感性熟悉 .至于内容大年夜体是差不多的但有些处所会加深外国史相对初中而言变多根本上就如 1题,化学解释 高中历史必修一的复习 高中历史有哪几块内容? 溶解是物理现象还是化学现象 高中历史必修一复习提纲简洁,易懂 就是在有材料的简答题后回答的那种 关于化学上的晶体和物理上的晶体的问题晶体,在化学上把冷却热饱和溶液或者蒸发溶剂得到的东西叫做晶体.但是百度百科上说各种金属都算是晶体,但是部分金属不溶于水,那物理上所指的晶
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn