对于大可以文本方式打开的文件,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相同的字符串(可以是中英文混合)就可以了,至于怎么保存可自己规划。