摘要:碼表非編碼碼只能用來編碼英文字符,各個(gè)國家為了表示他們自己的字符,分別擴(kuò)展了碼。為了統(tǒng)一字符編碼,國際標(biāo)準(zhǔn)化組織發(fā)布了俗稱的編碼規(guī)范。字符的編碼是,所以如果接收者收到以開頭的字節(jié)流,就知道這是編碼了。
引言
在網(wǎng)絡(luò)傳輸?shù)倪^程中,經(jīng)常會(huì)使用UTF-8編碼,以避免亂碼的問題。另外,我們使用文本編輯器編輯文件的時(shí)候,也可以選擇諸如ANSI、Unicode、UTF-8等多種編碼方式。那么,各種編碼方式之間有什么區(qū)別呢?
ASCII編碼對(duì)于計(jì)算機(jī)來說,所有的文件都是以二進(jìn)制的格式存儲(chǔ)的。所謂編碼,就是將二進(jìn)制位映射到字符集的過程。計(jì)算機(jī)最早起源于美國,當(dāng)時(shí)他們制定了一套字符編碼,將英語字符到二進(jìn)制位之間的關(guān)系,做了統(tǒng)一規(guī)定,稱為 ASCII碼。ASCII碼規(guī)定,0x20(十進(jìn)制32)以下的字節(jié)碼稱為“控制字符”,分別規(guī)定了特殊的用途;0x20到0x7F的字符稱為“打印字符”。ASCII編碼只使用一個(gè)字節(jié)的低7位。
ASCII碼表:
非ASCII編碼ASCII碼只能用來編碼英文字符,各個(gè)國家為了表示他們自己的字符,分別擴(kuò)展了ASCII碼。
ISO8859歐洲碼表,單字節(jié)編碼,包含一系列標(biāo)準(zhǔn),如:ISO8859-1(西歐字符集)、ISO8859-2(東歐字符集)等
編碼規(guī)則:
GB系列編碼與 ASCII 相容,所有的低位皆不使用
高位中的前 32 個(gè)碼位 (0x80 -- 0x9F 或 128--159),保留給擴(kuò)充定義的 32 個(gè)控制碼,稱為 C1 控制碼 (0--31 稱為 C0 控制碼)
高位中第 33 個(gè)碼位 (0xA0 或 160),也就是對(duì)應(yīng) ASCII 中 SP (空格) 的碼位,總是代表 Non-breakable space,也就是不準(zhǔn)許折行的空格
每個(gè)字符集定義至多 95 個(gè)字符,其碼位都在 0xA1 -- 0xFF 或 161--255
每個(gè)字符集收錄歐洲某地區(qū)的共同常用字符,如:ISO8859-1
漢字編碼GB2312、GBK和GB18030,擴(kuò)展了ASCII碼的高位字節(jié),并使用兩個(gè)字節(jié)來進(jìn)行編碼。從ASCII、GB2312、GBK到GB18030,這些編碼方式是向下兼容的,但是不同國家之間的字符編碼各不相同。為了統(tǒng)一字符編碼,ISO (國際標(biāo)準(zhǔn)化組織)發(fā)布了俗稱“UNICODE”的編碼規(guī)范。
UnicodeUnicode的學(xué)名是“Universal Multiple-Octet Coded Character Set”,簡(jiǎn)稱為UCS,UCS可以看作是"Unicode Character Set"的縮寫。
UCS有兩種格式:UCS-2(兩個(gè)字節(jié)編碼)和UCS-4(四個(gè)字節(jié)編碼),其中UCS-4實(shí)際上只用了31位,最高位必須為0。
UCS-4根據(jù)最高位為0的最高字節(jié)分成2^7=128個(gè)group,每個(gè)group再根據(jù)次高字節(jié)分為256個(gè)plane,每個(gè)plane根據(jù)第3個(gè)字節(jié)分為256行 (rows),每行包含256列(cells)。
group[0]的plane[0]被稱為“Basic Multilingual Plane”,即BMP。也就是說UCS-4中高兩位字節(jié)為0的碼位被稱作BMP,即:將UCS-4的BMP去掉前面的兩個(gè)零字節(jié)就得到了UCS-2。在UCS-2的兩個(gè)字節(jié)前加上兩個(gè)零字節(jié),就得到了UCS-4的BMP。而目前的UCS-4規(guī)范中還沒有任何字符被分配在BMP之外。
除了ASCII編碼之外,Unicode在制訂時(shí)沒有考慮與任何一種現(xiàn)有的編碼方案保持兼容,因此GBK與Unicode在漢字的內(nèi)碼編排上完全是不一樣的。
UTF-8和UTF-16Unicode只是規(guī)定了字符的編碼方式,UTF-8(UTF-16)是實(shí)現(xiàn)Unicode的一種用于傳輸?shù)木幋a規(guī)范。UTF-8編碼規(guī)則
使用單字節(jié)編碼,字節(jié)的第一位為0,后面7位為這個(gè)符號(hào)的Unicode碼。因此對(duì)于英文字符,UTF-8編碼和ASCII碼是相同的
使用n字節(jié)編碼,第一個(gè)字節(jié)的前n位都為1,第(n+1)位為0,后面(n-1)字節(jié)的前兩位都為“10”
UCS-2與UTF-8編碼對(duì)照:
UCS-2編碼(16進(jìn)制) | UTF-8編碼(二進(jìn)制) |
---|---|
0000 - 007F | 0xxxxxxx |
0080 - 07FF | 110xxxxx 10xxxxxx |
0800 - FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
UTF-16以16位為單元對(duì)UCS進(jìn)行編碼,對(duì)于小于0x10000的UCS碼,UTF-16編碼就等于UCS碼對(duì)應(yīng)的16位無符號(hào)整數(shù)。對(duì)于不小于0x10000的UCS碼,定義了一個(gè)算法。由于實(shí)際使用的UCS-2,或者UCS-4的BMP必然小于0x10000,因此可以認(rèn)為UTF-16和UCS-2基本相同。但UCS-2只是一個(gè)編碼方案,UTF-16卻要用于實(shí)際的傳輸,所以就不得不考慮字節(jié)序的問題。
UTF的字節(jié)序和BOMUTF-8以字節(jié)為編碼單元,因此沒有字節(jié)序的問題;而UTF-16以兩個(gè)字節(jié)為編碼單元,在解釋一個(gè)UTF-16文本前,首先要弄清楚每個(gè)編碼單元的字節(jié)序,即大端法(Big endian)還是小端法(Little endian)。
Unicode規(guī)范中推薦的標(biāo)記字節(jié)順序的方法是BOM(Byte Order Mark)。在UCS編碼中有一個(gè)叫做“ZERO WIDTH NO-BREAK SPACE”的字符,它的編碼是FEFF,而FFFE在UCS中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中。UCS規(guī)范建議我們?cè)趥鬏斪止?jié)流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE",這樣如果接收者收到FEFF,就表明這個(gè)字節(jié)流是Big-Endian的;如果收到FFFE,就表明這個(gè)字節(jié)流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明字節(jié)順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EFBBBF,所以如果接收者收到以EF BB BF開頭的字節(jié)流,就知道這是UTF-8編碼了。
BOM作為一種標(biāo)記方式,并不是強(qiáng)制要求的
BOM | 編碼方式 |
---|---|
EF BB BF | UTF-8 |
FF FE | UTF-16/UCS-2, Little endian |
FE FF | UTF-16/UCS-2, Big endian |
FF FE 00 00 | UTF-32/UCS-4, Little endian |
00 00 FE FF | UTF-32/UCS-4, Big endian |
ANSIutf8具有較好的容錯(cuò)性; 從utf8字節(jié)流任何一個(gè)地方截?cái)喽伎梢蕴^非法的部分找到下一個(gè)字符的開頭,如果采用unicode編碼,從一個(gè)字的中間截?cái)鄷?huì)導(dǎo)致接下來所有的字符解析都是錯(cuò)的,這在不可靠的網(wǎng)絡(luò)傳輸中是有利的
utf8是變長(zhǎng)的,對(duì)于常用字符,只使用一個(gè)字節(jié)編碼,可以有效節(jié)省存儲(chǔ)空間或帶寬
Windows系統(tǒng)中,記事本的編碼默認(rèn)是ANSI,代表系統(tǒng)默認(rèn)編碼,在中文系統(tǒng)中一般是GB系列編碼。
JVM采用的改進(jìn)版的UTF-8格式與“標(biāo)準(zhǔn)”的區(qū)別:
“null”字符((char)0)用雙字節(jié)編碼,而不使用單字節(jié),因此改進(jìn)版的UTF-8格式不會(huì)直接出現(xiàn)null值
改進(jìn)版的UTF-8只使用標(biāo)準(zhǔn)版UTF-8格式所定義的單字節(jié)、雙字節(jié)和三字節(jié)格式,JVM不能識(shí)別標(biāo)準(zhǔn)版UTF-8定義的四字節(jié)格式,而是使用自定義的兩個(gè)三字節(jié)格式來代替,且按照Big-Endian順序存儲(chǔ)
改進(jìn)版UTF-8編碼方式:
字節(jié)數(shù) | 位模式 | 碼點(diǎn)值 | 范圍 |
---|---|---|---|
單字節(jié) | 0xxxxxxx(x) | x&0x7f | 0001 - 007F |
雙字節(jié) | 110xxxxx(x) 10xxxxxx(y) | ((x&0x1f)<<6) + (y&0x3f) | 0080 - 07FF |
三字節(jié) | 1110xxxx(x) 10xxxxxx(y) 10xxxxxx(z) | ((x&0xf)<<12) + ((y&0x3f)<<6) + (z&0x3f) | 0800 - FFFF |
六字節(jié) | 11101101(u) 1010xxxx(v) 10xxxxxx(w) 11101101(x) 1011xxxx(y) 10xxxxxx(z) | 0x10000 + ((v&0xf)<<16) + ((w&0x3f)<<10) + ((y&0xf)<<6) + (z&0x3f) | U+FFFF |
參考資料:
http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_1.html
http://blog.csdn.net/baixiaoshi/article/details/40786503
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70869.html
摘要:默認(rèn)為是一個(gè)回調(diào)函數(shù),將腳本的所有輸出,用所定義的函數(shù)進(jìn)行處理。在輸出緩沖區(qū)的回調(diào)函數(shù)中使用這些函數(shù),會(huì)導(dǎo)致未定義的錯(cuò)誤。 簡(jiǎn)介 PHP有輸出時(shí),可以用輸出控制函數(shù)來控制輸出 緩沖階段 ob_start(),將內(nèi)部緩沖區(qū)(buffer)打開。當(dāng)PHP遇到echo,printf等輸出語句時(shí), PHP就會(huì)將要輸出的數(shù)據(jù)放入緩沖區(qū)(buffer)中,等待輸出。而只有當(dāng)緩沖區(qū)滿了或者php運(yùn)行...
摘要:本文是淺析微信支付系列文章的第十四篇,主要講解在如何開通商戶平臺(tái)的代金券或立減優(yōu)惠功能,商家向指定用戶發(fā)送代金券,查詢發(fā)送記錄,代金券信息等。代金券微信支付代金券業(yè)務(wù)是基于微信支付,為了協(xié)助商戶方便地實(shí)現(xiàn)營銷優(yōu)惠措施。 本文是【淺析微信支付】系列文章的第十四篇,主要講解在如何開通商戶平臺(tái)的代金券或立減優(yōu)惠功能,商家向指定用戶發(fā)送代金券,查詢發(fā)送記錄,代金券信息等。 淺析微信支付系列已...
摘要:如果對(duì)象長(zhǎng)度不相等,則為假。從后往前,判斷類中數(shù)組的單個(gè)字符是否相等,有不相等則為假。由此可以看出,如果對(duì)兩個(gè)超長(zhǎng)的字符串進(jìn)行比較還是非常費(fèi)時(shí)間的。字符串?dāng)?shù)值化比較將字符串?dāng)?shù)值化。 引言 從一段代碼說起: public void stringTest(){ String a = a+b+1; String b = ab1; System.out.println(...
摘要:前端最基礎(chǔ)的就是。一個(gè)朋友的問題,監(jiān)測(cè)下載進(jìn)度。這節(jié)主要是講如何使用,以及前端下載的核心操作。下載文件,并顯示進(jìn)度條。下載文件,并顯示進(jìn)度條下載文件上面已經(jīng)實(shí)現(xiàn)了,那我們先說說如何顯示進(jìn)度條。實(shí)現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計(jì)長(zhǎng)度。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(H...
閱讀 1332·2021-10-27 14:14
閱讀 3583·2021-09-29 09:34
閱讀 2488·2019-08-30 15:44
閱讀 1733·2019-08-29 17:13
閱讀 2577·2019-08-29 13:07
閱讀 880·2019-08-26 18:26
閱讀 3351·2019-08-26 13:44
閱讀 3217·2019-08-26 13:37