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