Get网页内容后,保存为一个CString后,需要进行不考虑大小写的查找FindNoCase和替换FindReplaceNoCase,但结果总是一些网页存在问题,
一些网页好像没有问题,好像是某些字符的影响,谁能告知原因呢?int CStringEx::FindNoCase1( LPCTSTR lpszSub, int startpos /*= 0*/ ) const
{
CStringEx sLowerThis = *this;
sLowerThis.MakeLower(); CStringEx sLowerSub = lpszSub;
sLowerSub.MakeLower(); return sLowerThis.Find( sLowerSub, startpos );
}好像MakeLower有时候不能成功转换,故改用charlower
int CStringEx::FindNoCase2( LPCTSTR lpszSub, int startpos /*= 0*/ ) const
{
CStringEx sLowerThis = *this;
CStringEx sLowerSub = lpszSub;
sLowerThis=CharLower(sLowerThis.GetBuffer(sLowerThis.GetLength()));
sLowerThis.ReleaseBuffer();
sLowerSub=CharLower(sLowerSub.GetBuffer(sLowerSub.GetLength()));
sLowerSub.ReleaseBuffer(); return sLowerThis.Find( sLowerSub, startpos );
}
可发现sLowerThis字节转换后会少一,结果也是有时正确,有时不正确.
int CStringEx::FindNoCase2( LPCTSTR lpszSub, int startpos /*= 0*/ ) const
{
CStringEx sLowerThis = *this;
CStringEx sLowerSub = lpszSub;
sLowerThis.CopyBeforeWrite();
CharLower(sLowerThis.m_pchData); sLowerSub.CopyBeforeWrite();
CharLower(sLowerSub.m_pchData); return sLowerThis.Find( sLowerSub, startpos );
}FindNoCase2返回的位置有时正确,有时好像又偏前一位字符,不知为何.其中 Find 为
int CStringEx::Find( LPCTSTR lpszSub, int startpos /*= 0*/ ) const
{
ASSERT(AfxIsValidString(lpszSub, FALSE)); // find first matching substring
LPTSTR lpsz = _tcsstr(m_pchData+startpos, lpszSub); // return -1 for not found, distance from beginning otherwise
return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);
}调试了很久,就是不知道问题在哪里,请各位指教.
不大清楚
int CStringEx::FindNoCase1( LPCTSTR lpszSub, int startpos /*= 0*/ ) const
{
CStringEx sLowerThis = *this;
CString str = "";
for(int i = 0; i < sLowerThis.GetLength(); i++)
{
if(sLowerThis[i]>='A' && sLowerThis[i]<='Z') str+=sLowerThis[i]+0x20;
else str += sLowerThis[i];
} CString sLowerSub = lpszSub;
sLowerSub.MakeLower(); return str.Find( sLowerSub, startpos );
}