成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺析字符編碼

荊兆峰 / 2818人閱讀

摘要:碼表非編碼碼只能用來編碼英文字符,各個(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ī)則:

與 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

GB系列編碼

漢字編碼GB2312、GBK和GB18030,擴(kuò)展了ASCII碼的高位字節(jié),并使用兩個(gè)字節(jié)來進(jìn)行編碼。從ASCII、GB2312、GBK到GB18030,這些編碼方式是向下兼容的,但是不同國家之間的字符編碼各不相同。為了統(tǒng)一字符編碼,ISO (國際標(biāo)準(zhǔn)化組織)發(fā)布了俗稱“UNICODE”的編碼規(guī)范。

Unicode

Unicode的學(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-16

Unicode只是規(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

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é)序和BOM

UTF-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
為什么網(wǎng)絡(luò)傳輸時(shí)常使用utf8編碼

utf8具有較好的容錯(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ǔ)空間或帶寬

ANSI

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

相關(guān)文章

  • 淺析PHP的輸出緩沖控制

    摘要:默認(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)行...

    wangjuntytl 評(píng)論0 收藏0
  • 淺析微信支付:商戶平臺(tái)代金券或立減優(yōu)惠開通、指定用戶代金券發(fā)放、查詢等

    摘要:本文是淺析微信支付系列文章的第十四篇,主要講解在如何開通商戶平臺(tái)的代金券或立減優(yōu)惠功能,商家向指定用戶發(fā)送代金券,查詢發(fā)送記錄,代金券信息等。代金券微信支付代金券業(yè)務(wù)是基于微信支付,為了協(xié)助商戶方便地實(shí)現(xiàn)營銷優(yōu)惠措施。 本文是【淺析微信支付】系列文章的第十四篇,主要講解在如何開通商戶平臺(tái)的代金券或立減優(yōu)惠功能,商家向指定用戶發(fā)送代金券,查詢發(fā)送記錄,代金券信息等。 淺析微信支付系列已...

    neroneroffy 評(píng)論0 收藏0
  • Java String 源碼淺析

    摘要:如果對(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(...

    2shou 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段-場(chǎng)景實(shí)戰(zhàn)(2019-06-06)-下載文件&下載進(jìn)度

    摘要:前端最基礎(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...

    sPeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<