您的位置:首页 > 其它

CString的MakeLower 特殊情况(乱码)下,转化会出错

2016-06-21 14:11 387 查看
测试代码如下:

char szText[256] = {0xA6,0xA7,0xA8,0xA9};
/*
char szText[256] = {0};
for (int nIndex = 1; nIndex < 256; nIndex++)
{
szText[nIndex - 1] = (char)nIndex;
}
*/
CString strText = szText;

CString strLower = strText;
strLower.MakeLower();


WIN7 VC6,ANSI表情况



注意A8被转换了。

char szText[256] = {0xA6,0xA7,0xA8,0xA9};情况

VC6,VC2013,在WIN7系统的情况下

a6 a7 a8 a9 00

 都会被转换为

 a6 c7 a8 a9 00

结论:调用CString的MakeLower(),要确保CString没有乱码的情况。

建议使用STL的string,代码如下:

char szText[256] = {0xA6,0xA7,0xA8,0xA9};
string strTest = szText;
std::transform(strTest.begin(), strTest.end(), strTest.begin(), ::tolower);


经过IDA跟踪分析,CString最终调用MSVCRT(D).dll的_mbslwr(char* string)函数,

char *__cdecl _mbslwr(char *string)
{
unsigned __int8 v2; // [sp+0h] [bp-10h]@10
int retval; // [sp+4h] [bp-Ch]@4
char ret[4]; // [sp+8h] [bp-8h]@4
char *cp; // [sp+Ch] [bp-4h]@1

_lock(25);
for ( cp = string; *cp; ++cp )
{
if ( byte_10265061[(unsigned __int8)*cp] & 4 )
{
retval = __crtLCMapStringA(__mblcid, 0x100u, cp, 2, ret, 2, __mbcodepage, 1);
if ( !retval )
{
_unlock(25);
return 0;
}
*cp = ret[0];
if ( retval > 1 )
*++cp = ret[1];
}
else
{
if ( (byte_10265061[(unsigned __int8)*cp] & 0x10) == 0x10 )
v2 = _mbcasemap[(unsigned __int8)*cp];
else
v2 = *cp;
*cp = v2;
}
}
_unlock(25);
return string;
}


而STL调用 MSVCRT(D).dll的int tolower( intc
);

int __cdecl tolower(int c)
{
int result; // eax@5
int local_lock_flag; // [sp+0h] [bp-4h]@7
int ca; // [sp+Ch] [bp+8h]@9

if ( dword_10264B24 )
{
InterlockedIncrement(&__unguarded_readlc_active);
if ( __setlc_active )
{
InterlockedDecrement(&__unguarded_readlc_active);
_lock(19);
local_lock_flag = 1;
}
else
{
local_lock_flag = 0;
}
ca = _tolower_lk(c);
if ( local_lock_flag )
_unlock(19);
else
InterlockedDecrement(&__unguarded_readlc_active);
result = ca;
}
else
{
if ( c >= 65 && c <= 90 )
c += 32;
result = c;
}
return result;
}

相关链接:
https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/65f0347a-5ed7-4ddb-8439-1b7989b4c14d/cstringmakelower-chinese-windows-crash?forum=vclanguage
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: