现在的位置: 首页 > 综合 > 正文

CString的一点获知

2013年08月15日 ⁄ 综合 ⁄ 共 1773字 ⁄ 字号 评论关闭

 
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文档将会是乱码。

 

 

 

  

抱歉!评论已关闭.