上一篇:用数组操作字符串 >>
UNICODE、DBCS的一点小知识
假如一个字符得到的DBCS值为&H1234,当然,这个值是转换成了十六进制的,因为对于磁盘存放来说,一般使用位(BIT),即二进制存放,而显示字节呢用十六进制显示则非常直观。存放在文件中即"12 34"(这是用十六进制文本编辑器中查看到的形式)
而UNICODE是世界性的字符集,几乎包含了世界上的所有字符,每个字符都有一个单一的UNICODE值。UNICODE值也是占用两个字节的。但不同的是它虽然也包含了标准的ANSI字符值,但是ANSI字符只占用一个字节,UNICODE会自动在ANSI值后加入一个值为0的字节。比如说一个ANSI值为&h45的字符,以UNICODE形式存放则为"45 00"。至于如何用VB得到一个字符的UNICODE值,ASCW函数可以轻松搞定。但是普通的非ANSI字符以UNICODE形式时则是从右存到左的。比如一个值为&H1234的字符,存为UNICODE时则为"34 12"
知道了这些有什么用呢?UNICODE的意义在于能让不同环境下的操作系统识别。比如说吧,你在中文的操作系统下使用记事本写了一篇文本文章。但你要拿到别的环境下的WIN2K(之所以选WIN2K,是因为WIN2K支持UNICODE,否则用WIN98只能用外接中文平台才能查看)下查看(比如美国的电脑,操作系统为英文,代码页也是美国(WIN2K有设置代码页)),即使该电脑已经安装了中文字体,即使用WORD这样的编辑软件打开也肯定是乱码一堆。这是为什么呢?因为英文的WIN2K操作系统只能识别UNICODE呀!并不能识别咱们亚洲的DBCS码呀!
解决方法只要你把它转换为UNICODE码存放就OK了!像Utrla Edit就能转换。WIN2K里也有代码转换器可以,而WIN2K下的记事本则可以用另chun为UNICODE码。如果你使用的是WIN9X,则可以自己用VB解决了。UNICODE码存放的文本文件与普通的文本文件不同之处仅仅是文件头加了"FF FE"而已。其他的则是代码值不同。只要转换了字符的代码,并在文件前加上"FF FE"这两个字节,就是把这篇中文文章保存为UNICODE格式了!转换成UNICODE格式后,英文操作系统的机器只要用WORD打开你的文件就能查看了!(为什么用WORD是因为它有字体识别功能。普通记事本只把文字链接到系统字体上,而英文系统的默认字体可不是不包含中文的哟!当然就显示不出来啦)
EXE等可执行文件的字串存放格式也差不多都是这样的。不过VB编写的程序有点意思,有些字符以DBCS存放,有些则是以UNICODE存放的。而其他工具编译的文件则大多为DBCS单一类型存放。DBCS存放的字符修改起来非常容易。使用UE这样的十六进制文本编辑器查找要修改的字串,只要把“查找ASCII”打上勾就OK了。但是用UNICODE存放的就不好这么找了。这下我们可以用VB来解决啦!前面已经提到,像一个值为&h1234的字符存放在文件中为"34 12"
那么我们用VB的ASCW函数得到它的十六进制值,再把值反过来不就可以了吗?反过来后再把这个值拿到UE中去搜索,不要把“查找ASCII”选上,这下我们要修改的文字就能找到了!再用VB把要替换进去的文字也转成相同的形式,再到UE里对照相应的值修改即可。
一般来说,VB里事先在开发环境下存放好的字符,如LABEL中的字符,就是以DBCS存放的。而硬编码在EXE中的文字。比如:
MSGBOX "这是编译在代码中的文字"
其中这几个中文字符就是以UNICODE形式存放的。还有资源文件中的字串资源亦是如此。
这样一来,即使软件作者硬编码在EXE中的文字我们都可以随意修改喽。HOHO
希望我写这篇文章对大家能有所帮助。
附:理论上程序使用UNICODE能不受操作系统环境影响,(WINDOWS的帮助上亦是如此之说)。但实际上因为受到字体链接等环境因素影响,并不能正常的显示出文字。要使软件国际化还是建议使用资源文件,多建几个不同代码页的字串表。这样一来方便以后修改,二来对于EXE程序的资源占用也有好处。
下一篇:Setparent函数用法技巧 >>
相关文章:
- · 使用Visual Basic操纵XML文档
- · 使用VB6.0设计ActiveX DLL事件
- · VB动态调用外部函数的方法
- · 建立一个程序员自己的全国性营销网络
- · 如何编写高质量的VB代码
- · 为更新到Visual Basic.NET准备你的Visual Basic 6.0应用程序
- · 再谈在VB中调用VC++开发的DLL
- · 用VB语言编程实现JPEG数据压缩
- · 用DTS实现SQL数据库的导入
- · vb实现多线程!
- · VB6 自动编译组件
- · 用vb制作ActiveX Dll中,怎么让程序连接远程机器1888端口,并且等待接收信息
- · 以Oracle为例说明如何通过ODBC将数据库中的指定表导出到MDB数据库。
- · VB的API编程精粹(一)
- · VB的API编程精粹(二)
- · 在 VB 中使用 Unicode API
- · 用VB编写COM+应用时碰到问题?
- · Crystal Report(水晶报表)的报表封装成VB的DLL
- · 使用API创建窗体(类似VC的创建过程)
- · 谈谈如何象VB IDE的Immediate一样不使用工程,可以单独执行代码片断
- · (vb)利用GetBitmapBits,SetBitmapBits加速图像处理
- · 基于VB6+ADO+ListView制作的一个数据库分页显示程序(完整原程序)
- · 基于ADO+Adodc控件+DataGrid控件制作的一个数据库编辑程序(完整原程序)
- · 基于Winsock控件制作的一个“服务器,N客户端”通讯程序(完整原程序)
- · 用VB调试串口通讯
- · 如何在VB例程中接收自定义消息
- · vb基础
- · vb基础(打印问题)
- · 用VB写高效的图像处理程序
- · 基于VB算法+Picture+Timer控件制作的39种动画效果,类似屏保(完整原程序)
- · 如何用VB获得Windows各类系统目录
- · 用VB实现DES加解密算法(一)--定义
- · 用vb实现DES加解密算法(二)--加密
- · 用vb实现DES加解密算法(三)--解密
- · VB实现抽象类
- · 应用数据结构(一)线性表节点的插入和删除算法
- · 用 VB 实现表单的自动提交
- · VB6开发领航(一)
