做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个字节,在多字节下一个字符就是一个字节