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