做c++2年多了,一直对字符集这样概念有些模糊,却又一直都有所涉及,今天就简单的总结哈,
此问题虽简单但总结哈也能让自己更清晰。
1.多字节字符集和Unicode字符集区别
多字节字符集英文一个字符站1位(一个字节),其他语言可能是多个字节表示一个字符,Unicode下
一个字符都是用2个字节表示。
2.多字节字符与宽字节字符
char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示,看下面的例子。
void TestChar(){
char ch1 =
's';
// 正确
cout <<
"ch1:" << ch1 << endl;
char ch2 =
'中';
// 错误,一个char不能完整存放一个汉字信息
cout <<
"ch2:" << ch2 << endl;
char str[4]
= "中";
//前三个字节存放汉字'中',最后一个字节存放字符串结束符\0
cout <<
"str:" << str << endl;
//char str2[2] = "国"; // 错误:'str2' : array bounds overflow
//cout << str2 << endl;}
结果如下:
ch1:s
ch2:
str:中
wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。看下面的例子:
void TestWchar_t(){ wcout.imbue(locale("chs"));
// 将wcout的本地化语言设置为中文
wchar_t wch1 = L's';
// 正确 wcout <<
"wch1:" << wch1 << endl;
wchar_t wch2 = L'中';
// 正确,一个汉字用一个wchar_t表示 wcout <<
"wch2:" << wch2 << endl;
wchar_t wstr[2]
= L"中";
// 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0 wcout <<
"wstr:" << wstr << endl;
wchar_t wstr2[3]
= L"中国"; wcout <<
"wstr2:" << wstr2 << endl;}
13
结果如下:
ch1:s
ch2:中
str:中
str2:中国
2._T 、L、TEXT宏之间关系
在Unicode下_T ,TEXT和L一样,在字符串前面加上L
在多字符下,_T,TEXT同普通字符一样处理
3.一些c++下宏的定义总结
4.strlen、wcslen、sizeof之间的区别
strlen返回的是字节数(对中英文不一致,中文占两个字节,不包括'\0');
wcslen返回的是字符数(对中英文一致);
sizeof返回的是字节数(包含'\0',而'\0'在Unicode下也是占两个字节的)。
注:在Unicode下一个字符是2个字节,在多字节下一个字符就是一个字节