多字節與Unicode

編碼知識

1、Unicode與多字節(ANSI

(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

2、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

3、ANSI

(1)概念

能夠認爲ANSI / MBCS (多字節字符集) / 本地編碼是同一個概念,不一樣的國家和地區制定了不一樣的標準,有GB23十二、GBK、GB18030、Big五、Shift_JIS 等各自的編碼標準,ASCII就是美國國家的ANSI標準,一個國家的代碼到另外一個國家使用,有可能因爲編碼標準不一致,致使亂碼,因而纔有了萬國碼Unicode,各國通用。

總結

相關文章
相關標籤/搜索