当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用这个就有点儿扯了
------解决思路----------------------
一次就乱掉了,别说两次了。