編碼和字符集那些事兒

2021-10-09 02:08:36 字數 2607 閱讀 3256

字符集是人為規定的(相關標準委員會,如iso/iec)制定的,將」文字字元「與」數字「一一對應的靜態表。

其中,每個」文字字元「對應的數字,也稱為其編碼

例如,ascii碼表就是乙個字符集

字符集字元

編碼ascii

『a』65

ascii

『0』48

字元 character: 文字元號

字符集 charset:字元的集合,規定一系列字元與數字(編碼)的對應關係

字符集都是由某些組織指定和發布的,例如iso/iec就負責制定字符集。

每個字符集都有乙個標準編號,例如ascii字符集的編號為iso/iec 646(即,由iso/iec發布的第646號標準文件)

拉丁字符集:收錄了歐洲各個國家的字元。例如,細佬字母 aα bβ

拉丁字符集的編號為 iso 8859系列,例如:

note: gb(國標)

雙位元組編碼, 每個位元組的高位為1,

漢字:2個位元組

ascii碼:1個位元組

不包含生僻字對於人名、古漢語等方面出現的罕用字,gb2312不能處理,這導致後來gbk以及gb18030漢字字符集的出現。

note: gbk是gb2312的超集, 包含了gb2312, 較為常用

unicode是國際組織指定的可以容納世界上所有文字和符號的字元編碼方案。

unicode可以用數字0-0x10ffff來對映這些字元,最多可以容納1114112個字元。那麼用幾個位元組來表示乙個字元呢?

第一種方案:utf-32

每個字元用乙個int來表示

特點:簡單,但太浪費空間

第二種方案:utf-16編碼

特點:用1~2個short來表示乙個字元

第三種方案:utf-8編碼

用1~4個位元組來表示乙個字元(比較節省空間)

上述的拉丁字元的總數遠超256個,無法使用乙個char型表示,得用兩個位元組表示。所以,即使不用中文,使用外文本母表示也是有問題的,例如:

char a = 'α'; // 這樣無法正確表示

這和中文字元問題的原因是相同的:無法使用乙個位元組來表示乙個字元。

什麼時候需要編碼轉換?

例如:你的字串按照gbk編碼,但是對方要求按utf-16編碼。

char str = "你好";

4個位元組,傳送給對方,但是對方只接受utf-16編碼。。。

不同的平台都提供了函式來做編碼轉換,這裡介紹在vc下的編碼轉換方法,其他平台下的後續有時間再補上。

vc中,用wchar_t代表寬字元, 相當於short型。乙個wchar_t的資料來存放unicode字元。

note: 在源**中寫出「你好」兩個字元的編碼是啥? 這取決於你源**本身的編碼。

例如,在linux上,一般預設的字符集是utf-8的,「你好」的編碼就是utf-8的,所以他是6個位元組。

而在windows中文版本上,預設按gbk編碼,所以它是4個位元組。

#include #include // 標頭檔案

#include #include // gbk -> utf-16

int test1()

; char text_gbk = "你好"; // 字串字面常量,取決於cpp檔案本身的字符集

wchar_t text_utf16[256] = ;

int n = multibytetowidechar(cp_acp, 0,

text_gbk, strlen(text_gbk),

text_utf16, 256);

printf("結果: %d 個寬字元 \n", n);

n = sizeof(text_gbk);

return 0;

}// gbk -> utf-16 -> utf-8

int test2()

; int n1 = multibytetowidechar(cp_acp, 0, text_gbk, strlen(text_gbk), text_utf16, 256);

printf("結果: %d 個寬字元 \n", n1);

// char text_utf8[256];

int n2 = widechartomultibyte(cp_utf8, 0, text_utf16, n1, text_utf8, 256, null, 0);

printf("結果: %d 個位元組 \n", n2);

return 0;

}int main()

字符集和字符集編碼詳解

gb2312 gbk ascii asni unicode utf 8等等,這些字眼非常常見,同時帶來許多的問題。本文只是從理解的角度,說明以上內容的不同含義從而達到區分其用法的目的是夠了的。至於實現方式,可以查閱各自的詳細標準官方文件。先解釋乙個概念,什麼是字符集,嗯,不解釋了,我弄乙個吧 從今以...

字符集和編碼

什麼是字元?字元就是文字和符號的統稱,字符集就是多個字元的集合,字符集有很多種,常見的有ascii,gb2312,unicode字符集。什麼是編碼?計算機要準確的處理字符集中的文字,就需要對字元進行編碼。對unicode字符集編碼的叫做unicode編碼,對ascii字符集編碼叫做ascii編碼。a...

編碼和字符集

ascii unicode gb2312等都是字符集,用於定義編號指代的字元。utf 8,utf 16則是unicode的編碼格式。ascii ascii只有128個,能表示英文 數字 常用符號。gb2312 gb2312是中文特有的字符集,有2萬多個字元,前128個和ascii保持一致,因此能相容...