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*/

你可能感兴趣的:(unicode)