CString GetLength()
::
MBCS ===>字节数
UNICODE==》字符数
CString::GetBuffer
LPTSTR GetBuffer( int nMinBufLength );
MBCS===>char *
UNICDOE==> whar_T *
1.Use Multi-Byte Character Set
CString str;
str+=L"你好";
str+=L"i";
str+="i";
str+=L"哦";
str+=L"o";
AfxMessageBox(str);==>显示:::你好ii哦o
str.GetLength()==9(byte) ==>加上L"i" L"o"并不能导致以宽字符存储还是单字节。。。。文档实际上是以ANSI形式存储。 9字节
CFile fil;
fil.Open(_T("ReadMe.txt"),CFile::modeCreate | CFile::modeWrite);
int len =str.GetLength();//Returns the number of characters in a CString object.
#ifdef _UNICODE
//只赋值数据
BYTE head[2];
head[0]=0xFF;
head[1]=0xFE;
fil.Write(head,2);
#endif
TCHAR * lp=str.GetBuffer(0);
fil.Write(lp,len*sizeof(TCHAR));
fil.Close();
文档存贮内容:你好ii哦o
9字节
2.Unicode char set
CString str;
str+=L"你好";
str+=L"i";
str+="i";
str+=L"哦";
str+=L"o";
AfxMessageBox(str);==>显示:::你好ii哦o
str.GetLength()==6(char) ====>没有加上L,,,也转化为宽字符存贮。。。。。文档实际上是以UNICODE形式存储。14字节
CFile fil;
fil.Open(_T("ReadMe.txt"),CFile::modeCreate | CFile::modeWrite);
int len =str.GetLength();//Returns the number of characters in a CString object.
#ifdef _UNICODE
//只赋值数据
BYTE head[2];
head[0]=0xFF;
head[1]=0xFE;
fil.Write(head,2);
#endif
TCHAR * lp=str.GetBuffer(0);
fil.Write(lp,len*sizeof(TCHAR));
fil.Close();
文档存贮内容:你好ii哦o
14字节
总结:所的字符串赋值给一个CString对象或与CString对象运算时,将会被转换成TCHAR字符串......
而这个字符串是ANSI string还是unicode string取决于当前工程_UNICODE,,_MBCS宏的定义状况..
所在使用CString时首先要清楚工程当前的编码宏定义状况,清楚此点,还可以利用CString做一些
字符串编码的转换,如若unicode的工程里,通过CString的符值操作,就很简单的将个ANSI的字符串
自动装换为UNICODE,不过要注意这仅适用于ANSI(与当前操作系统的版本有关),对于中文
操作系统来说,ANSI===GBK了,,其它的另论。若遇到以ANSI字符串为参数的函数,一定要把CString转换 为 ANSI。。。WideCharToMultiByte(CP_ACP.......)..
文件是unicode还是ansi取决于字符串(数据本身)的性质:
字符串前缀FFFE 保存后unicode编码文件
字符串前缀FF EE BE 保存后utf-8编码文件
没有标志 保存后默认为ANSI...(),若把一个uicode字符串保存为ANSI文档将会是乱码。