多位元組字元與寬字元

2021-09-30 16:28:02 字數 2589 閱讀 7251

多位元組字符集——每個字元的編碼寬度不一,可為乙個位元組或多個位元組。

(1)ascii字元只佔乙個位元組

(2)對於中文、日文等用兩個位元組

(3)乙個字串中,如何區分哪個是中文字元,那個是ascii字元呢?

「windows程式設計」16進製制(10進製)的編碼wi

ndow

s程式設

計6e6fb3 cc

d0 f2

c9 e8

bc c6

-77 -52

-48 -14

-55 -24

-68 -58

①說明:ascii碼為乙個位元組,中文為兩個位元組,均為負數

②優點:節約記憶體。 

③缺點:每次查詢,都需要從頭到尾掃瞄,效率低。

char c ="windows程式設計";

printf("%d\n",sizeof(c));  //輸出16,陣列總長度為16位元組,含\0

printf("%d\n",strlen(c));  //輸出15,字元的長度為15個位元組,不含\0

寬位元組字符集——每個字元的編碼寬度都相等,均是兩個位元組

(1)ascii字元的處理。擴充為兩個位元組,在原先的位元組前補充乙個位元組0x00

(2)結束符為兩個\0

(3)字串的解釋都是兩個字元為單位進行的。所以查詢效率快,但記憶體占用大。

「windows程式設計」16進製制的編碼:wi

ndow

s程式設

計006e

006f

7a0b

5e8f

8bbe

8ba1

wchar_t c = l"windows程式設計";

printf("%d\n",sizeof(c));  //輸出24,陣列總長度為16位元組,含結束符

printf("%d\n",wcslen(c));  //輸出11,字元的長度為11個,不含結束符

相容兩種的字符集——如何相容呢?

#ifdef _unicode

#define _tcslen wcslen

#define tchar wchar_t

#define lptstr wchar_t*

#define _t(x) l##x

#else

#define _tcslen strlen

#define tchar char

#define lptstr char*

#define _t(x) x

#endif

【例】tchar c = _t("windows程式設計");

//多位元組字符集下

printf("%d\n",sizeof(c)); //16

printf("%d\n",_tcslen(c)); //15

//寬字符集下

printf("%d\n",sizeof(c)); //24

printf("%d\n",_tcslen(c)); //11

字符集的對比

ascii

unicode

通用版本

字元型別

char\char

wchar_t\wchar

tchar

函式兩種版本

printf

strlen

messageboxa

wprintf

wcslen

messageboxw

_tprintf 

_tcslen

messagebox巨集:text\_text

_t\__t

【例】

#include #include #include int main()

windows中的字串函式

通用版本

c語言中的ascii版本

lstrlen

strlen

lstrcpy

strcpy

lstrcpyn

strcpyn

lstrcat

strcat

lstrcmp

strcmp

lstrcmpi

strcmpi

//ascii碼版

int winapi winmain(hinstancehinstance,hinstance hprevinstance,pstr szcmdline,int icmdshow)

//unicode版

int winapi winmain(hinstance hinstance,hinstance hprevinstance, pstr szcmdline, int icmdshow)

//通用版本

int winapi winmain(hinstance hinstance,hinstance hprevinstance, pstr szcmdline, int icmdshow)

寬字元和多位元組字元(mbtowc wctomb)

c 語言原本是在英文環境中設計的,主要的字符集是7 位的ascii 碼。從此開始,8 位的byte 位元組 變成最常見的字元編碼單位,但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用乙個位元組編碼,於是世界上使用各式 各樣多位元組的字元編碼集合已經有數十年了,比如用來表示 非拉丁字...

C C 多位元組字元與寬字元的輸出

使用c 標準庫的iostream,可以方便地將控制台 檔案 字串以及其它可擴充的外部表示作為流來處理,但要處理中文,卻會碰到很多問題。本人原來沒怎麼用過這個iostream,這幾天嘗試用這個寫點東西,一會兒不能輸出中文,一會兒不支援中文檔名的,搞得頭大。網上搜了搜,沒有發現適用於所有情況的解決方案。...

C 多位元組字元與寬位元組字元相互轉換

pragma once class strtransfer 字元型別 wchar t char 獲取字元長度 wcslen strlen 連線兩個字串 wcscat strcpy 複製字串 wcscpy strcpy 比較兩個字串 wcscmp strcmp 具體引數詳見www.linuxidc.c...