当前位置: 代码迷 >> VC/MFC >> 关于A2W和W2A宏的用法遇到的有关问题
  详细解决方案

关于A2W和W2A宏的用法遇到的有关问题

热度:171   发布时间:2016-05-02 03:38:28.0
关于A2W和W2A宏的用法遇到的问题
当A2W和W2A出现后,也许很多人都不在使用参数繁多的WIDECHARTOMUILTBYTE或MUITLBYTESTOWIDECHAR这两函数

A2W和W2A确实很好用,但不知道大家伙在使用的过程中,有没有遇到一些奇怪的问题或现象呢?


我遇到过这样一个问题:

CString strT = L"xifd19320ooofdsf中国人xDDFAF";

for( int index = 0 ; index < strT.GetLength() ; ++ index)
{
WCHAR wc = strT[index];
wc = ~wc;
strT.SetAt(index,wc);
}

USES_CONVERSION;
string st = W2A(strT.GetBuffer());

================================
以上代码,是将一字符串中的每个字符取反,在赋值给本身。

然后跟踪发现,string st和CString strT 是不一样的值。


=======================================
for(int index = 0 ;index<st.length();index++)
{
char chr = st[index];
chr = ~chr;
st[index] = chr;
}

CString strxxx = A2W(st.c_str());

这是将上面从CString转换为string后的字符串进行再次取反,即还原到原字符串。

但结果是失败的。



抛个砖头,请各位大侠来围观。。。




====================================
附注:

在很多时候,尤其在我一个实际的项目中,发现,当string或CString类型的length很大的时候,当他们之间相互转换的时候,

就可能出现,转换不对的情况。


但,当字符串很短的时候,如果是一般的字符串(没有对串中的字符进行各种运算如取反操作)的,就不会出现问题

比如:

string  strx  = "fasdfdafdafdf去得分";
CString strT = A2W(strx.c_str();

就没问题。

不知道为什么

我先抛砖头了、

------解决思路----------------------
CString strT = L"xifd19320ooofdsf中国人xDDFAF";

for( int index = 0 ; index < strT.GetLength() ; ++ index)
{
WCHAR wc = strT[index];
wc = ~wc;
strT.SetAt(index,wc);
}

USES_CONVERSION;
string st = W2A(strT.GetBuffer());

================================
以上代码,是将一字符串中的每个字符取反,在赋值给本身。

然后跟踪发现,string st和CString strT 是不一样的值。
---------------------------------------------------------------------------------------------

但,当字符串很短的时候,如果是一般的字符串(没有对串中的字符进行各种运算如取反操作)的,就不会出现问题

比如:

string  strx  = "fasdfdafdafdf去得分";
CString strT = A2W(strx.c_str();
---------------------------------------------------------------------------------------------

你这前后逻辑不多啊,取反之后转换,结果怎么可能会一样呢,还是我被你绕晕了?
------解决思路----------------------
另外,这两个宏只能转换CP_ACP如果是其他比如CP_UTF8什么的就不行了,MFC中可以用一用,标准Win32用这个就有点儿扯了
------解决思路----------------------
引用:
Quote: 引用:

不知道你反复的 A2W 和 W2A 有何意义。如果是给字符串取反就不要这样去做了,取反之后谁知道还是不是合法字符。这样的话 A2W 或 W2A 转换必然会乱掉,怎么可能指望它转换回来?即便是正常的文字,比如韩文,W2A 再 A2W 之后内容也都丢失了。



大侠,没有反复调用就掉了一次
比如:
string  str = "fdfdf";
str = xx;//xx为str逐字节取反后的结果
CString strW = A2W(str.c_str());

看下,strW的值,是否与xx一样

(比如:string “123” 转换后的CString 是不是L"123")

一次就乱掉了,别说两次了。
  相关解决方案