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);
}调试了很久,就是不知道问题在哪里,请各位指教.

解决方案 »

  1.   

    应该是UNICODE的原因吧?
    不大清楚
      

  2.   

    自己转换看看:
    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 );
    }
      

  3.   

    ymbymb,可以实现,但速度太慢,我发现可能是有些文本存在宽字符造成的,ANSI 编程是否就不行了呢?是否一定需要转换成UNICODE编程呢? 若必须这样,我就麻烦啦,几万行代码,谁能提供意见,难道我必须把所有的代码都改成UNICODE方式吗, 我能否仅仅实现查询这部分的UNICODE编码呢? 谁能告诉我.