打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

测试代码如下:

	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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++各种类型转换,期待你的加入,共同完善
c++ CString char[] int string 之间转化
怎么完成CString与int的转换??
CString/string 区别及其转化
memset
VC字符串转ASCII码输出
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服