vs2013 c++ 编程CString字符串查找替换后变乱码的原因及解决方法

来源:互联网 发布:数据库实用教程 下载 编辑:程序博客网 时间:2024/05/16 06:24

      对于大可以文本方式打开的文件,vs2013下用CString自身的查找替换函数不会出问题,但有些文件较特殊,比如vs工程的资源文件*.rc和resource.h,这些文件也可用记事本打开,但它们不是普通的文本文件,用CString查找时明明有相同字符串可它就是找不到,或者碰巧找到了替换后变成乱码.

      问题产生的原因是CString的替换操作破坏了原文件的二进制编码,这是因为VS用unicode编码,无论中英文字符串,每个中文字\英文字符都占两个字节,对于英文字符,有效编码在低字节位,高字节位为'\0'. 中文字时两个字节都有效,CString的getlength计算的字符串长度不对,导致替换不完整及二进制编码错位.编码错位后高低字节位颠倒,所以显示乱码.

     解决的办法是:

           1. 采用二进制方式打开文件,将文件的全部内容读入到char*缓冲区.

           2.不要将缓冲区内容付给CString进行查找操作, 而是正好相反,需要把要替换的字符串转为char*到缓冲区查找.

           3. 如果要替换的字符串本身就保存在char*或char[]数组中无需任何额外操作,但当替换字符串是保存在CString中时要进行类型转换:

                     char *p = (LPSTR)(LPCTSTR)a_CString;

          4.最关键的一步,计算替换字符串的长度。

int GetCStringLength(CString str)
{
 int len, i;
 char *p = (LPSTR)(LPCTSTR)str;
 i = 0;
 while (p[i] != '\0')
 {
  ++i;
  i++;
 }
 return i;
}

      5, 在缓冲区查按计算的长度找与*p相同的字符串(可以是中英文混合)就可以了,至于怎么保存可自己规划。

0 0
原创粉丝点击