如果将2000系统的默认语言切换为日文(或英文,繁体中文),你将发现很多软件输出的是
一堆乱码或?。其它人的程序也就罢了,可是,俺们提供给用户的程序也这样。偏偏用户中
有小日本,他用中文Win2000,但却将默认语言设为日文,唉。
出现问题描述:
我们的程序结构是:客户端的输出采取HTML(混合VB脚本),关键业务采用ActiveX控件。
控件由VC编写。乱码为VC编写的ActiveX控件中的输出。
分析一下原因:
1:VB或VB脚本在调用COM时,如果COM为非Unicode版本,在传递字符串(String)参数时,
会将字串按本地默认代码页进行转换,如果当前的本地代码页并不是预期的简体中文页
(如936),则会出现转换失败的情况,也就是将传递"?"字符到COM(或者说OCX)。这时,出现
信息丢失和不正确,会输出?。
2:在显示DC中绘制字符串时,需要指定正确的字体(Font),特别是字体的字符集设置(CharSet),
否则,在进行文字输出时,无法进行正确的字库定位。如果未指定字体字符集,应该会采用默认
语言设置的字符集,也就是说:如果中文内码未指定字符集,而采用默认的日文字符集,将出
现字体对应错,会显示出乱码。
前提,对应字符集的默认代码页一定要存在和正确先。
解决方法:
1:控件应编译为Unicode版,这样,VB在传字符参数时,将会传递Unicode版,不与本地默认语言
相关。不会出现内码转换的过程,也不会出现信息丢失(转换生成"?")。
同理,VC写的程序,想直接拿到其它默认语言环境下,可以直接使用,请将所有输出变为Unicode。
2:调用控件时,一定要设置正确的字符集。如:在简中环境时,需要将Ldger的字体字符集设置为
GB2312_CHARSET。对英文和繁体环境对应是:ANSI_CHARSET,CHINESEBIG5_CHARSET
注意:
如果用VC调用控件时,如果控件为ANSI版,则可以传递对应ANSI内码(因为VC并不存在类似VB的字符
串转换的步骤)。但是,如果VC调用UNICODE版的控件时,需要将传入字串变为UNICODE传入,这样,
才能保证内码正确。
附1:
显示乱码一般有两个原因,
一是内码不正确,一般是由于自动的转码造成信息丢失。可能会出现"?"(默认的转码失败处理为?)。
二是显示的问题,具体每种显示处理可能会不同(没完全去总结过),上述只是处理了在dc上进行最基
本绘制的处理,它与字体字符集设置相关。而对于一些开发工具提供的资源的显示,还需要区分处理
,当然,如果干脆在最底层控制它的绘制,一般就可以处理正确,但比较麻烦。并且,在这点上,VC
好办(窗口都可以SubClass),但是对于VB的程序,反正你可以试试VB写的程序,其提供的资源在其它
默认语种的环境下大都是显示乱码或?。暂不清楚该如何处理,只知道或者可以都变成图片,呵。
附2:
在html中有标识可以指定页面中字符编码集。
<meta http-equiv="content-type" content="text/html; charset=gb2312">
而控件的默认属性继承于父窗体,所以,只要你的控件中显示输出的字体采用控件级的字体,那么,
控件用户就无需对字符集进行设置了,它默认为采用html页中的指定字符集。
石头 整理于2005-09-01