首先dbcs是亚洲的字符集,包含了ansi,ansi也就是ascii值为0-255之间的字符,当字符为ansi时,存放于文件中占用的是一个字节。如果是非ansi的呢,则占用两字节。用vb的asc函数可以很容易得到一个字符的dbcs值(或是说ansi值吧)
假如一个字符得到的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程序的资源占用也有好处。