0 總結(jié)
需要注意字符集和字符編碼是不同的。比如當(dāng)我們提到“數(shù)據(jù)庫使用的是unicode字符集”,這樣的說法是錯(cuò)誤的,數(shù)據(jù)庫中的數(shù)據(jù)一定要具體到某一種字符編碼,只提到字符集是沒有意義的,例如數(shù)據(jù)庫使用UFT-8編碼。
字符集:字符和字符碼的映射關(guān)系,例如在ASCII中a的字符碼就是97,表示在字符集的97號(hào)位置上是字符’a’。
字符編碼:字符與字節(jié)流的映射關(guān)系,例如在ASCII中’a’的字節(jié)流就是01100001,在UTF中根據(jù)編碼方式的不同,可能是01100001或0000000001100001。
名字解釋:
Code Point = 字符碼
Character Set = 字符集
Character Encoding = 字符編碼
1 常見編碼
1.1 單字節(jié)編碼:ASCII
ASCII使用1個(gè)字節(jié)(8個(gè)bit)來記錄一組常用字符,見下表:
例如其中字母a的二進(jìn)制位:1100 001
= 97,那么a在計(jì)算機(jī)中就可以用1100001
來保存。
注意上表中其實(shí)只使用了7個(gè)二進(jìn)制位,最高位b8沒有使用。
所以目前ASCII只使用7個(gè)二進(jìn)制位保存128個(gè)字符,還有128個(gè)位置未使用。
1.2 單字節(jié)編碼:ASCII擴(kuò)展OEM字符集
對(duì)于ASCII的第一次擴(kuò)展:OEM(IBM PC)字符集,實(shí)際上就是使用了ASCII后面的128個(gè)位置,還是單字節(jié)字符集。
下面列舉兩種常用的:
ISO/IEC 8859-1:1998,又稱Latin-1或“西歐語言”
ISO/IEC 8859-2:1999,又稱Latin-2或“中歐語言”
對(duì)于拉丁語國家,除了我們熟知的a-z、A-Z之外,還存在衍生拉丁字母:
á é í ó ú Y à è ì ò ù ? ê ? ? ? ? ? ? ? ü ?
á é í ó ú y à è ì ò ù a ê ? ? ? ? ? ? ? ü ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? T
? ? ? ? ? ? ? ? ? ? ? ? ? ? t
可以看到,對(duì)于拉丁語系國家,單字節(jié)可以覆蓋所有字符,Latin編碼足夠使用了。
但是對(duì)于非拉丁語系國家,例如漢語,單字節(jié)編碼的256個(gè)位置是遠(yuǎn)遠(yuǎn)不夠的。
1.3 雙字節(jié)編碼:大五碼、GB碼
單字節(jié)編碼在中文環(huán)境中顯然是不夠用的,中文區(qū)的標(biāo)準(zhǔn)編碼是GB系列。
- 大五碼是早期繁體中文的事實(shí)標(biāo)準(zhǔn),基本被GB碼取代。
- GB碼初代沒有包含繁體,到今天的國家標(biāo)準(zhǔn)GB18030已經(jīng)囊括了基本所有中、少數(shù)民族、日、韓漢字。
- 演進(jìn):GB2312(2字節(jié))→擴(kuò)展繁體字→GBK(2字節(jié))→擴(kuò)展少數(shù)民族中日韓等→GB18030國家標(biāo)準(zhǔn)(4字節(jié))。
- 注意GBK都是向下兼容的,即GB18030兼容GB2312,因?yàn)槭褂玫木幋a位置沒有重疊。
1.3.1 大五碼
Big5碼是一套雙位元組字符集,使用了雙八碼儲(chǔ)存方法,以兩個(gè)字節(jié)來安放一個(gè)字。第一個(gè)字節(jié)稱為“高位字節(jié)”,第二個(gè)字節(jié)稱為“低位字節(jié)”。
“高位字節(jié)”使用了0x81-0xFE,“低位字節(jié)”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分區(qū)中:
0x8140-0xA0FE | 保留給使用者自定義字元(造字區(qū)) |
---|---|
0xA140-0xA3BF | 標(biāo)點(diǎn)符號(hào)、希臘字母、特殊符號(hào),包括在0xA259-0xA261,安放了九個(gè)計(jì)量用漢字:兙兛兞兝兡兣嗧瓩糎。 |
0xA3C0-0xA3FE | 保留。此區(qū)沒有開放作造字區(qū)用。 |
0xA440-0xC67E | 常用漢字(5401字),字集來源除教育部“常用國字標(biāo)準(zhǔn)字體表”所列4808字外,并優(yōu)先收編國中、國小教科書中常用字587字及異體字6字。先按筆畫再按部首排序。 |
0xC6A1-0xC8FE | 保留給使用者自定義字元(造字區(qū)) |
0xC940-0xF9D5 | 次常用漢字(7652字),字集來源除教育部“次常用國字標(biāo)準(zhǔn)字體表”所列6330字外,并篩選編入教育部“罕用國字標(biāo)準(zhǔn)字體表”表中使用頻率較高之1320字。亦是先按筆畫再按部首排序。 |
0xF9D6-0xF9DC | 七個(gè)倚天外字集的擴(kuò)充字:碁銹裏墻恒粧嫺(此七字分別為“棋鏽裡牆恆妝嫻”之異體字) |
0xF9DD-0xFEFE | 保留給使用者自定義字元(造字區(qū)) |
1.3.2 GBK
字符有一字節(jié)和雙字節(jié)編碼,00
–7F
范圍內(nèi)是第一個(gè)字節(jié),和ASCII保持一致,此范圍內(nèi)嚴(yán)格上說有96個(gè)文字和32個(gè)控制符號(hào)。
之后的雙字節(jié)中,前一字節(jié)是雙字節(jié)的第一位??傮w上說第一字節(jié)的范圍是81
–FE
(也就是不含80
和FF
),第二字節(jié)的一部分領(lǐng)域在40
–7E
,其他領(lǐng)域在80
–FE
。
具體來說,定義的是下列字節(jié):
范圍 | 第1字節(jié) | 第2字節(jié) | 編碼數(shù) | 字?jǐn)?shù) |
---|---|---|---|---|
水準(zhǔn)GBK/1 |
A1 –A9
|
A1 –FE
|
846 | 717 |
水準(zhǔn)GBK/2 |
B0 –F7
|
A1 –FE
|
6,768 | 6,763 |
水準(zhǔn)GBK/3 |
81 –A0
|
40 –FE (7F 除外) |
6,080 | 6,080 |
水準(zhǔn)GBK/4 |
AA –FE
|
40 –A0 (7F 除外) |
8,160 | 8,160 |
水準(zhǔn)GBK/5 |
A8 –A9
|
40 –A0 (7F 除外) |
192 | 166 |
用戶定義 |
AA –AF
|
A1 –FE
|
564 | |
用戶定義 |
F8 –FE
|
A1 –FE
|
658 | |
用戶定義 |
A1 –A7
|
40 –A0 (7F 除外) |
672 | |
合計(jì): | 23,940 | 21,886 |
2 字符集標(biāo)準(zhǔn)
可以理解為標(biāo)準(zhǔn)是一套字符集的集合,根據(jù)本地化的規(guī)則選擇使用哪個(gè)字符集。
注意這些標(biāo)準(zhǔn)互相是不兼容的。
2.1 ANSI
與字符集不同,另一個(gè)維度的概念是字符集標(biāo)準(zhǔn):由于不同的地區(qū)定義了大量不同的字符集,就拿單字節(jié)編碼的字符集來說,就有ASCII、latin等等,雖然前128個(gè)字符一樣,但后128個(gè)字符就完全不同了。
標(biāo)準(zhǔn)協(xié)會(huì)選擇了一些比較常用的單字節(jié)編碼作為ANSI標(biāo)準(zhǔn),ANSI不指定某一種具體的字符集,而是根據(jù)系統(tǒng)locale選擇具體使用哪一種單字節(jié)字符集。
ANSI沒有固定字符集。
2.2 ISO 8859-1
ISO 8859-1 也是一種編碼標(biāo)準(zhǔn),由歐洲開發(fā)。長度也是一個(gè)字節(jié),前 0~127 與 ASCII 一致,剩下的128個(gè)字符大多是歐洲語言所使用的字符,所以可以認(rèn)為ISO 8859-1是為歐洲語言所定制的一套編碼標(biāo)準(zhǔn)。一般情況ISO 8859-1標(biāo)準(zhǔn)會(huì)使用Latin 1。
2.3 GBK
事實(shí)上我們使用的GBK、GB18030都是標(biāo)準(zhǔn),但由于我們的標(biāo)準(zhǔn)只對(duì)應(yīng)一套特定的字符集,所以可以認(rèn)為GBK就是字符集。
3 大統(tǒng)一
字符集、標(biāo)準(zhǔn)種類繁多,但是無論使用哪一種字符集,都無法做到顯示任意國家的字符,所以u(píng)nicode字符集出現(xiàn)了。
3.1 unicode
unicode使用4字節(jié)共32個(gè)二進(jìn)制位,為每個(gè)字符都確定了一個(gè)唯一的編碼,由于整體搜索空間龐大,實(shí)際使用的量比較少。所以將整體分為了17組,叫做字符平面。平時(shí)使用0號(hào)平面即可覆蓋大部分場景。0號(hào)平面也叫做基本多文種平面(Basic Multilingual Plane, BMP)。
from wiki:
部分0號(hào)平面的分布:
3.2 字符碼與字符編碼解耦
強(qiáng)映射的問題
傳統(tǒng)編碼中,字符碼與字符編碼是完全綁定的,例如在ASCII中,'a’的字符碼是97,'a’的字符編碼也是97。
在輸入’a’時(shí),系統(tǒng)直接映射為0110 0001
存入即可,這種強(qiáng)映射方式好處是使用簡單,快捷。但缺點(diǎn)是不靈活,每個(gè)字符碼編碼出的結(jié)果是固定的,如果存在這樣一個(gè)場景:unicode四個(gè)字節(jié)中,英文字母只占很少的一部分,如果客戶只使用英文,unicode中永遠(yuǎn)只有1個(gè)字節(jié)的數(shù)據(jù)是有意義的,剩下三個(gè)字節(jié)都沒用到,但是強(qiáng)映射的方式下,數(shù)據(jù)傳輸、存儲(chǔ)只能用4個(gè)字節(jié),造成非常大的浪費(fèi)。
unicode將字符碼與編碼解耦
在unicode中,每一個(gè)字符保證有唯一字符碼,將 字符碼到存儲(chǔ)二進(jìn)制之間的“字符編碼”過程獨(dú)立出來,提供了三種編碼方法:
- UTF-8:使用1或2或3或4個(gè)字節(jié)。
- UTF-16:使用2或4個(gè)字節(jié)
- UTF-32:固定使用4個(gè)字節(jié)。
例如a在UTF-16下編碼為0x0061
占用兩個(gè)字節(jié),在UTF-8下編碼為0x61
占用一個(gè)字節(jié)。
4 總結(jié)
需要注意字符集和字符編碼是不同的。比如當(dāng)我們提到“數(shù)據(jù)庫使用的是unicode字符集”,這樣的說法是錯(cuò)誤的,數(shù)據(jù)庫中的數(shù)據(jù)一定要具體到某一種字符編碼,只提到字符集是沒有意義的,例如數(shù)據(jù)庫使用UFT-8編碼。
- 字符集:字符和字符碼的映射關(guān)系,例如在ASCII中a的字符碼就是97,表示在字符集的97號(hào)位置上是字符’a’。
- 字符編碼:字符與字節(jié)流的映射關(guān)系,例如在ASCII中’a’的字節(jié)流就是01100001,在UTF中根據(jù)編碼方式的不同,可能是
01100001
或0000000001100001
。
名字解釋:
- Code Point = 字符碼
- Character Set = 字符集
- Character Encoding = 字符編碼
5 Postgresql中的字符集
再看PG服務(wù)端支持的字符集支持,可以看到Name部分都是具體的字符編碼方法,最通用的就是UTF8,支持所有語言,空間占用1-4字節(jié)。文章來源:http://www.zghlxwxcb.cn/news/detail-417810.html
截取部分:文章來源地址http://www.zghlxwxcb.cn/news/detail-417810.html
Name | Description | Language | Server? | ICU? | Bytes/Char | Aliases |
---|---|---|---|---|---|---|
BIG5 |
Big Five | Traditional Chinese | No | No | 1–2 |
WIN950 , Windows950
|
EUC_CN |
Extended UNIX Code-CN | Simplified Chinese | Yes | Yes | 1–3 | |
EUC_JP |
Extended UNIX Code-JP | Japanese | Yes | Yes | 1–3 | |
EUC_JIS_2004 |
Extended UNIX Code-JP, JIS X 0213 | Japanese | Yes | No | 1–3 | |
EUC_KR |
Extended UNIX Code-KR | Korean | Yes | Yes | 1–3 | |
EUC_TW |
Extended UNIX Code-TW | Traditional Chinese, Taiwanese | Yes | Yes | 1–3 | |
GB18030 |
National Standard | Chinese | No | No | 1–4 | |
GBK |
Extended National Standard | Simplified Chinese | No | No | 1–2 |
WIN936 , Windows936
|
ISO_8859_5 |
ISO 8859-5, ECMA 113 | Latin/Cyrillic | Yes | Yes | 1 | |
ISO_8859_6 |
ISO 8859-6, ECMA 114 | Latin/Arabic | Yes | Yes | 1 | |
ISO_8859_7 |
ISO 8859-7, ECMA 118 | Latin/Greek | Yes | Yes | 1 | |
ISO_8859_8 |
ISO 8859-8, ECMA 121 | Latin/Hebrew | Yes | Yes | 1 | |
LATIN1 |
ISO 8859-1, ECMA 94 | Western European | Yes | Yes | 1 | ISO88591 |
LATIN2 |
ISO 8859-2, ECMA 94 | Central European | Yes | Yes | 1 | ISO88592 |
LATIN3 |
ISO 8859-3, ECMA 94 | South European | Yes | Yes | 1 | ISO88593 |
LATIN4 |
ISO 8859-4, ECMA 94 | North European | Yes | Yes | 1 | ISO88594 |
LATIN5 |
ISO 8859-9, ECMA 128 | Turkish | Yes | Yes | 1 | ISO88599 |
LATIN6 |
ISO 8859-10, ECMA 144 | Nordic | Yes | Yes | 1 | ISO885910 |
LATIN7 |
ISO 8859-13 | Baltic | Yes | Yes | 1 | ISO885913 |
LATIN8 |
ISO 8859-14 | Celtic | Yes | Yes | 1 | ISO885914 |
LATIN9 |
ISO 8859-15 | LATIN1 with Euro and accents | Yes | Yes | 1 | ISO885915 |
LATIN10 |
ISO 8859-16, ASRO SR 14111 | Romanian | Yes | No | 1 | ISO885916 |
SJIS |
Shift JIS | Japanese | No | No | 1–2 |
Mskanji , ShiftJIS , WIN932 , Windows932
|
SQL_ASCII |
unspecified (see text) | any | Yes | No | 1 | |
UTF8 |
Unicode, 8-bit | all | Yes | Yes | 1–4 | Unicode |
到了這里,關(guān)于字符集與字符編碼的區(qū)別與演進(jìn)(ASCII、GBK、UNICODE)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!