(1)Windows中,Unicode也稱爲寬字節,多字節也稱爲窄字節; VS中默認使用Unicode編碼,在項目屬性>>配置屬性>>常規>>字符集中可選擇Unicode字符集或者多字節字符集windows
(2) Unicode與多字節函數版本、字符、字符串類型的區別網絡
Win32 API中大部分參數有字符串的函數都有兩個版本函數
以A結尾,表明多字節版本 | 以W結尾,表明Unicode版本 | 根據版本自動選擇的 |
---|---|---|
如:CreateEventA | 如:CreateEventW | 如:CreateEvent |
C運行庫也有不少相似的函數編碼
多字節版本 | Unicode版本 | 自適應版本 |
---|---|---|
strcpy | wcscpy | _tcscpy |
strcat | wcscat | _tscscat |
strlen | wcslen | _tcslen |
函數有兩種,因此字符也有兩種操作系統
多字節字符 | Unicode字符 | 自適應字符 |
---|---|---|
char | wchar_t | TCHAR |
(3) 常見Win32字符串類型3d
LPSTR、LPWSTR、LPTSTR、LPCTSTR指針
LP前綴,表明指針;STR後綴表明字符串code
LPSTR:表明多字節blog
LPWSTR:表明Unicode內存
LPTSTR:T自適應
LPCTSTR:C表明const+T表明自適應
備註:變量類型使用自適應類型後如LPTSTR,相關字符串須要用TEXT()進行包裹
const char* str = "hello"; const wchar_t* wstr = L"hello"; const TCHAR* tstr = TEXT("hello");
(4)關於_T()
#ifdef _UNICODE #define _T(X) L ## X //Unicode版本 #else #define _T(X) X //多字節版本 #endif
(5)Unicode與多字節的選擇
1.Unicode程序環境適應能力強,不會出現亂碼問題
2.Unicode程序運行速度比多字節程序快。緣由:Windows內部都是使用Unicode編碼,多字節函數會將參數轉碼後交給Unicode函數
3.控制後臺可以使用多字節,GUI程序最好使用Unicode
(1)Unicode實現方式:UTF-32
以4個byte爲編碼單元進行定長存儲,調度器一次性下發4個byte進行存儲任務
主要有兩種方式:
大端法UTF-32BE:地址由小向大增長,而數據從高位往低位放 ,在網絡上傳輸數據廣泛採用的都是大端
小端法UTF-32LE:地址由小向大增長,而數據從低位往高位放,在英特爾處理器,Windows10操做系統,採用小端法。
(2)UTF-16
也有大小端模式
UTF-16 LE是windows上默認的Unicode編碼方式,使用wchar_t表示。全部wchar_t *類型的字符串(包括硬編碼在.h/.cpp裏的字符串字面值)
char chinese[] = "你"; //大小爲3個byte,一個char存儲結束符,兩個char存儲漢字字符‘你’ 1char:1byte wchar_t wchinese[] = L"你"; //大小爲4個byte, 一個wchar_t存儲結束符,一個wchar_t存儲漢字字符‘你’ 1wchar_t:2byte(window下) auto size = sizeof(chinese); // 3 byte auto wsize = sizeof(wchinese); // 4 byte auto len = strlen(chinese); // 2個字符(除去結束符) auto wlen = wcslen(wchinese); // 1個字符(除去結束符)
優點:就是大多數狀況下一個wchar_t表示一個字符(包括中文字符)
坑:char *類型的字面值,最終內存使用何種編碼方式徹底取決於當前文件的編碼方式
備註:在Windows上應該銘記沒有char / std::string這種類型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string
(3)UTF-8
優點:無字節序的概念,不用考慮大小端問題,適用與字符串的網絡數據傳輸
劣勢:如上代碼,一個char並不能表示一個漢字字符,每每須要兩個char
(1)概念
能夠認爲ANSI / MBCS (多字節字符集) / 本地編碼是同一個概念,不一樣的國家和地區制定了不一樣的標準,有GB23十二、GBK、GB18030、Big五、Shift_JIS 等各自的編碼標準,ASCII就是美國國家的ANSI標準,一個國家的代碼到另外一個國家使用,有可能因爲編碼標準不一致,致使亂碼,因而纔有了萬國碼Unicode,各國通用。