本人前段时间曾遇到界面乱码问题,
原因是程序中利用类Cstring,_bstr_等进行多字节到unicode的转换.比如: char * pi = "简体中文936";转换成unicode界面输出 
pWin->SetWindowText(CString(pi));_bstr_ bs = pi;
wstring wsz = A2W(pi);这些转换在中文环境下没有任何问题,不管是显式的转换还是隐式的转换.
即使在英文操作系统里,通过设置语言区域等等,也没有问题.但在英文系统中,不能设置系统的语言区域等等情况下,如何能使得
CString(pi);
_bstr_ bs = pi;
wstring wsz = A2W(pi); 
能正常转换?api里面有setlocale,_setmbcp等函数,无论我在程序里怎么改变区域,语言,代码页都没有用,以上转换都是乱码.可能我这几个函数用得不对,希望有经验的高手指教一二.本来想忽视这个问题,无奈程序里这样的转换太多,不得不重视起来.

解决方案 »

  1.   

    系统内部使用了当前代码页转换, 很多地方都会出问题的可以使用 MultiByteToWideChar 指定代码页, 创建的窗体指定Unicode
      

  2.   


    MultiByteToWideChar 是我现在所知能解决的唯一方法,而且必须要指定代码页(936)
    这样的话,所有的转换都要改写了.
      

  3.   


    现在是想在程序运行时更改代码页,使得CString,A2W能正确把ANSI转换成unicode.
      

  4.   

    楼主需要注意以下一点以下是VC6的A2W系统列宏转换使用的代码,一般都需要写入前置宏USES_CONVERSION,而此宏使用的是栈空间,一般情况下栈在程序的默认设置为1M大小,所以待转换文本长度过大时可能会转换失败。void func( LPSTR lpsz )
    {
       USES_CONVERSION;
       ...
       LPWSTR x = A2W(lpsz)
       // Do something with x
       ...
    }VC2005,也就是ATL8有更安全的转换宏。
      

  5.   

    看来不良编程习惯害人不浅啊,平时ANSI转unicode时都喜欢CSring(char *),_bstr_(char *)
    这样写太方便了,现在吃到苦头了.
    看来以后还是要老老实实的用MultiByteToWideChar
      

  6.   


    en,这个我也清楚,一般简短的信息才会用A2W类宏
      

  7.   

    A2W里面也是MultiByteToWideChar 
    只不过取得ACP不符合要求
    自己先设置一下ACP应该就没问题了
    试试 SetThreadLocale 
      

  8.   


    en,经过测试SetThreadLocale可以解决部分问题,Ctring(char *),A2W都可以正常转换了.
    _bstr_(char*)还是不能,但也不想深究了,以后还是用MultiByteToWideChar比较可靠.