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;
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