VC字符处理(一)Ansic-Unicode处理

 

1.ANSIC与Unicode字符

   两者区别就不多少了,一个单字节一个双字节,Unicode可以表示更多的字符,适合诸如汉字的文字系统.

   定义使用宽字符:

 2.声明Unicode字符与及字符串方法:

   _T()宏需要包含tchar.h

1 wchar_t c=L'A';
2 wchar_t szBuffer[10]=L"A String";
3  

WinNt.h定义了一下宏:

1 #ifdef UNICODE
2 typedef WCHAR TCHAR ,*PTCHAR,PTSTR;
3 typedef CONST WCHAR *PCTSTR;
4 #define __TEXT(quote) quote
5 #define __TEXT(quote) L##quote
6
7 #else
8 typedef CHAR TCHAR ,*PTCHAR,PTSTR;
9 typedef CONST CHAR *PCTSTR;
10 #define __TEXT(quote) quote
11
12 #endif
13 #define __TEXT(quote) quote TEXT(quote)
14
15  

 

 可以利用以上宏来定义:在Visual Studio新建工程,一般都开启了Unicode选项,直接就可以定义宽字符。

1 TCHAR C=TXET('a');//如果定义了Unicode 则是16位字符,否则是8位
2   TCHAR C=L'a';
3 TCHAR szBuffer[10]=TEXT("a String");
4 TCHAR szBuffer[10]=_T("a String");
5  

3.Ansic与Unicode的转换:

 

 

 

1 //定义ANSIC字符串
2   char *c ="Test!";
3 std::cout<<c<<std::endl;
4 //ANSIC转到宽字符
5   int Length = MultiByteToWideChar(CP_ACP,0,c,-1,NULL,0);
6 wchar_t *pWideCharStr = new wchar_t[sizeof(wchar_t)*Length];
7 MultiByteToWideChar(CP_ACP,0,c,6,pWideCharStr,Length*sizeof(wchar_t));
8 std::wcout<<"MultiByteToWideChar:"<<pWideCharStr<<std::endl;
9 //宽字符转换到ANSIC
10   Length = WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,NULL,0,NULL,NULL);
11 char *pMultiByte = new char[Length*sizeof(char)] ;
12 WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,pMultiByte,Length*sizeof(char),NULL,NULL);
13 std::cout<<"WideCharToMultiByte:"<<pMultiByte;
14
15 delete [] pWideCharStr;
16 delete [] pMultiByte;

 补充:

       size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );//Convert wide-character string to multibyte string

       size_t mbstowcs ( wchar_t * wcstr, const char * mbstr, size_t max );//Convert multibyte string to wide-character string

      这两个看就清楚怎么用了就不写了 比上面方法要简单

4.推荐的字符串使用方式

1).开始将文本字符串想像为字符的数组,而不是char或字节的数组
2).用通用的数据类型如用TCHAR PTSTR表示字符和字符串
3).统一用TEXT _T宏来表示字面量的字符和字符串,不要混用
4).用BYTE和 PBYTE来表示字节、字节指针和数据缓冲区
5).避免使用printf系列函数,尤其不要使用%s来进行Ansic跟Unicode的互相转换
      应该使用MultiByteToWideChar和WideCharToMutiByte,具体用法参看MSDN

6).推荐从现在开始就使用Unicode字符,理由很简单,为了程序代码的重用性:Com编程模型只支持Unicode   

      微软.Net技术,还有新的API函数都不支持ANSIC

 

 /*转载请注明出处:听风独奏www.GbcDbj.com-----Charm*/

posted on 2010-08-04 15:58  Pro.Charm  阅读(2074)  评论(7编辑  收藏  举报

导航