在EVC + WINCE平台,用CFile类的成员函数Write往.txt文件中写入数字或者字母都没有问题,而如果写入汉字,则.txt文件在Windows系统中用记事本程序打开,数字与字幕显示正确,而汉字则显示为乱码。
对于上述现象,后来改用标准的C运行库函数fopen、fwrite等进行文件操作就解决了,但是个中缘由不深了了。
现在结合网上的一些资料,对字符串的操作进行一个简要的总结,不当之处还望批评指正。
首先,说说GetLength和sizeof的区别:
在VC中, CString str = "asd你好"; str.GetLength() = 7
而sizeof("asd你好") = 8;
在EVC中,CString str = _T("asd你好"); str.GetLength() = 5
而 sizeof(_T("asd你好")) = 12;
两种环境,GetLength函数为何得到了不同的两种结果,VC的msdn中有对GetLength函数的如下说明,而EVC却没有:
For multibyte character sets (MBCS), GetLength counts each 8-bit character; that is, a lead and trail byte in one multibyte character are counted as two bytes.
然后,转载网上的一些资料:
在VC + Windows中,操作字符串很方便,因为WINDOWS的字处理能力实在是很强大,它支持多种字符集。我们随便使用一个CString str=“你好”,就可以输入我们想要的中文字符串。
在EVC + WINCE中,情况有所改变,因为WINCE的字处理能力不够强大,它在处理字符时,统一将它示为 UNICODE编码,所以我们在EVC中处理中文字符串时需要用到UNICODE编码。下面结合WINDOWS 下VC字符串的处理,对比一下EVC中文字符串的片理方法。
一、中文字符串定义
1、在VC中我们如果定义一个中文字符串,可以使用CString str=“你好”或LPCTSTR str=“你好”。
2、在EVC中我们如果想定义一个中文字符串,可以使用如下方法:CString str=_T(“你好”)或者LPCTSTR str=“你好”,这里LPCTSTR在EVC里就是表示UNICODE字符串。值得注意的是_T()宏中,括号中只能填写常量,不能填定变量。
二、字符串操作
1、在VC中我们想拷贝字符串,可以作如下操作:
char s[20];
CString str=“你好”;
strcpy(s,str);
在EVC中则不能这样做,首先定义中文数组应该用双字节指针wchar_t,而拷贝函数也不能用strcpy,而应该用:wchar_t * wcscpy(wchar_t * wDest,wchar_t wSource);函数,操作如下:
wchar_t s[20];
CString str=“你好”;
wcscpy(s,(LPCTSTR)str); //前面没有转成UNICODE编码,所以这里需要强制转换
2、在VC中我们想在一个字符串中查找某个子串,只需要作下面的操作:
CString str=“你是一个好学生”;
str.Find(“学生”);
在EVC中不能这样做,因为中文字符串为UNICODE编码,我们必需在查找函数的参数里作如下修改:
str.Find(_T(“学生”));
以上是我在用EVC写应用程序时操作中文字符串的一些积累,以文记之,以备不时之需。