Cstring/_bstr_/A2W unicode转换存在的安全隐患问题

saiyaman5 2011-01-06 03:59:16
本人前段时间曾遇到界面乱码问题,
原因是程序中利用类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等函数,无论我在程序里怎么改变区域,语言,代码页都没有用,以上转换都是乱码.

可能我这几个函数用得不对,希望有经验的高手指教一二.

本来想忽视这个问题,无奈程序里这样的转换太多,不得不重视起来.
...全文
226 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
saiyaman5 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]

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

en,经过测试SetThreadLocale可以解决部分问题,Ctring(char *),A2W都可以正常转换了.
_bstr_(char*)还是不能,但也不想深究了,以后还是用MultiByteToWideChar比较可靠.
  • 打赏
  • 举报
回复
A2W里面也是MultiByteToWideChar
只不过取得ACP不符合要求
自己先设置一下ACP应该就没问题了
试试 SetThreadLocale
saiyaman5 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 webipstin 的回复:]

楼主需要注意以下一点

以下是VC6的A2W系统列宏转换使用的代码,一般都需要写入前置宏USES_CONVERSION,而此宏使用的是栈空间,一般情况下栈在程序的默认设置为1M大小,所以待转换文本长度过大时可能会转换失败。

C/C++ code
void func( LPSTR lpsz )
{
USES_CONVERSION;
...
LPWSTR x = A2W……
[/Quote]

en,这个我也清楚,一般简短的信息才会用A2W类宏
saiyaman5 2011-01-06
  • 打赏
  • 举报
回复
看来不良编程习惯害人不浅啊,平时ANSI转unicode时都喜欢CSring(char *),_bstr_(char *)
这样写太方便了,现在吃到苦头了.
看来以后还是要老老实实的用MultiByteToWideChar

webipstin 2011-01-06
  • 打赏
  • 举报
回复
楼主需要注意以下一点

以下是VC6的A2W系统列宏转换使用的代码,一般都需要写入前置宏USES_CONVERSION,而此宏使用的是栈空间,一般情况下栈在程序的默认设置为1M大小,所以待转换文本长度过大时可能会转换失败。

void func( LPSTR lpsz )
{
USES_CONVERSION;
...
LPWSTR x = A2W(lpsz)
// Do something with x
...
}


VC2005,也就是ATL8有更安全的转换宏。
saiyaman5 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzz3265 的回复:]

系统内部使用了当前代码页转换, 很多地方都会出问题的

可以使用 MultiByteToWideChar 指定代码页, 创建的窗体指定Unicode
[/Quote]

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

saiyaman5 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzz3265 的回复:]

系统内部使用了当前代码页转换, 很多地方都会出问题的

可以使用 MultiByteToWideChar 指定代码页, 创建的窗体指定Unicode
[/Quote]

MultiByteToWideChar 是我现在所知能解决的唯一方法,而且必须要指定代码页(936)
这样的话,所有的转换都要改写了.
saiyaman5 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]

引用 2 楼 akirya 的回复:
中文语言支持装了没

你装了相关的语言包了没有?
[/Quote]

语言包肯定装了.
Yofoo 2011-01-06
  • 打赏
  • 举报
回复
系统内部使用了当前代码页转换, 很多地方都会出问题的

可以使用 MultiByteToWideChar 指定代码页, 创建的窗体指定Unicode

healer_kx 2011-01-06
  • 打赏
  • 举报
回复
你在Linux上面试验的?
Eleven 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
中文语言支持装了没
[/Quote]
你装了相关的语言包了没有?
  • 打赏
  • 举报
回复
中文语言支持装了没
信阳毛尖 2011-01-06
  • 打赏
  • 举报
回复
在英文系统中,不能设置系统的语言区域等等情况下
----------------------------------------
这样的话中文能识别么(所以是乱码)?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧