本人前段时间曾遇到界面乱码问题,
原因是程序中利用类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等函数,无论我在程序里怎么改变区域,语言,代码页都没有用,以上转换都是乱码.可能我这几个函数用得不对,希望有经验的高手指教一二.本来想忽视这个问题,无奈程序里这样的转换太多,不得不重视起来.
原因是程序中利用类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等函数,无论我在程序里怎么改变区域,语言,代码页都没有用,以上转换都是乱码.可能我这几个函数用得不对,希望有经验的高手指教一二.本来想忽视这个问题,无奈程序里这样的转换太多,不得不重视起来.
MultiByteToWideChar 是我现在所知能解决的唯一方法,而且必须要指定代码页(936)
这样的话,所有的转换都要改写了.
现在是想在程序运行时更改代码页,使得CString,A2W能正确把ANSI转换成unicode.
{
USES_CONVERSION;
...
LPWSTR x = A2W(lpsz)
// Do something with x
...
}VC2005,也就是ATL8有更安全的转换宏。
这样写太方便了,现在吃到苦头了.
看来以后还是要老老实实的用MultiByteToWideChar
en,这个我也清楚,一般简短的信息才会用A2W类宏
只不过取得ACP不符合要求
自己先设置一下ACP应该就没问题了
试试 SetThreadLocale
en,经过测试SetThreadLocale可以解决部分问题,Ctring(char *),A2W都可以正常转换了.
_bstr_(char*)还是不能,但也不想深究了,以后还是用MultiByteToWideChar比较可靠.