日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

CString的MakeLower 特殊情況(亂碼)下,轉(zhuǎn)化會(huì)出錯(cuò)

 行走在理想邊緣 2019-04-15

測(cè)試代碼如下:

	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被轉(zhuǎn)換了。

char szText[256] = {0xA6,0xA7,0xA8,0xA9};情況
VC6,VC2013,在WIN7系統(tǒng)的情況下

a6 a7 a8 a9 00

 都會(huì)被轉(zhuǎn)換為
 a6 c7 a8 a9 00
結(jié)論:調(diào)用CString的MakeLower(),要確保CString沒(méi)有亂碼的情況。

建議使用STL的string,代碼如下:

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


經(jīng)過(guò)IDA跟蹤分析,CString最終調(diào)用MSVCRT(D).dll的_mbslwr(char* string)函數(shù),

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調(diào)用 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;
}

相關(guān)鏈接:

https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/65f0347a-5ed7-4ddb-8439-1b7989b4c14d/cstringmakelower-chinese-windows-crash?forum=vclanguage

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多