欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

[VB.NET Tips]StrConv简体转繁体在繁体操作系统下显示为乱码

程序员文章站 2022-03-10 18:33:26
公司ERP系统(WINFORM)要搞个繁体版,供中国*同胞使用。 为了简便起见,写了几个方法,在Form_Load里调用。 核心的还是这一句:objControl.text = StrConv(objControl.text, VbStrConv.TraditionalChinese) 在简体版W ......

公司erp系统(winform)要搞个繁体版,供中国*同胞使用。
为了简便起见,写了几个方法,在form_load里调用。

    public sub transcontroltexttotraditionalchinese(byref tpinstance as form)

        tpinstance.text = transtexttotraditionalchinese(tpinstance.text)

        for each objcontrol in tpinstance.controls

            if typeof (objcontrol) is menustrip orelse
               typeof (objcontrol) is toolstrip orelse
               typeof (objcontrol) is statusstrip then

                transcontroltexttotraditionalchinese_tool(objcontrol)

            elseif typeof (objcontrol) is flowlayoutpanel then

                transcontroltexttotraditionalchinese_flowlayoutpanel(objcontrol)

            elseif typeof (objcontrol) is panel orelse
                   typeof (objcontrol) is groupbox then

                transcontroltexttotraditionalchinese(objcontrol)

            elseif typeof (objcontrol) is tabcontrol then

                transcontroltexttotraditionalchinese_tabcontrol(objcontrol)

            elseif typeof (objcontrol) is datagridview then

                transcontroltexttotraditionalchinese_datagridview(objcontrol)

            elseif typeof (objcontrol) is textbox orelse
                   typeof (objcontrol) is label orelse
                   typeof (objcontrol) is button orelse
                   typeof (objcontrol) is checkbox orelse
                   typeof (objcontrol) is radiobutton then

                objcontrol.text = strconv(objcontrol.text, vbstrconv.traditionalchinese)

            end if

        next

    end sub

核心的还是这一句:objcontrol.text = strconv(objcontrol.text, vbstrconv.traditionalchinese)

在简体版win7下运行良好。到了中文(*)繁体版win7下,直接成了乱码了。
[VB.NET Tips]StrConv简体转繁体在繁体操作系统下显示为乱码
真是百思不得其解。

仔细研究了一下strconv方法,还有第三个参数。

public function strconv(str as string, conversion as microsoft.visualbasic.vbstrconv, optional localeid as integer = 0) as string

查了msdn也没有结果,最后在网上查到了相关资料。
毛病就出这个localeid这个参数上,这个参数指的是转换后的语言的代码。
以下是我在网上搜索到的windows下常用语言以及对应的代码

语言 代码
中文(香港特别行政区) 3076
中文(中国) 2052
中文(*) 1028
英语(美国) 1033

在office及vs的安装目录都能看到2052这个目录,代表的就是中文简体。
那我们做一些测试。

    textbox1.text = strconv("我是中国人", vbstrconv.traditionalchinese, 2052)    '显示我是中國人
    textbox2.text = strconv("我是中国人", vbstrconv.traditionalchinese, 1028)    '显示乱码  我是中?人
    textbox3.text = strconv("我是中国人", vbstrconv.traditionalchinese, 1033)    '显示我是中國人 

1028是windows下的中文(*)代码。在转换使用这个代码表时,不是所有的中文简体编码值在繁体中都存在,所以就出现了?号。
而localeid默认为0也就是使用系统默认的,那在中文(*)繁体版操作系统下这个就为1028.
所以出现了之前的那个乱码的图片。
那最好使用1033。代表英文en-us,当使用1033时,遇到中文时就会以unicode来编码。就不会出现简繁转换乱码的问题。

最终把我的代码改为了:

objcontrol.text = strconv(objcontrol.text, vbstrconv.traditionalchinese)