字元集(charset):是一個系統支援的所有抽象字元的集合。字元是各種文字和符号的總稱,包括各國家文字、标點符号、圖形符号、數字等。
字元編碼(character encoding):是一套法則,使用該法則能夠對自然語言的字元的一個集合(如字母表或音節表),與其他東西的一個集合(如号碼或電脈沖)進行配對
ascii編碼:
上個世紀60年代,美國制定了一套字元編碼,對英語字元與二進制位之間的關系,做了統一規定。這被稱為ascii碼,一直沿用至今。
ascii碼一共規定了128個字元的編碼,比如空格“space”是32(二進制00100000),大寫的字母a是65(二進制01000001)。這128個符号(包括32個不能列印出來的控制符号),隻占用了一個位元組的後面7位,最前面的1位統一規定為0
unicode編碼:
組織(the unicode consortium)是由一個非營利性的機構所運作,并主導 unicode 的後續發展。
utf-32:
utf-16:
盡管有unicode字元非常多,但是實際上大多數人不會用到超過前65535個以外的字元。是以,就有了另外一種unicode編碼方式,叫做utf-16(因為16位
= 2位元組)。utf-16将0–65535範圍内的字元編碼成2個位元組.
對于utf-16編碼,不同計算機以不同順序儲存位元組。這意味着字元u+4e2d在utf-16編碼方式下可能被儲存為4e
2d或者2d 4e,這取決于該系統使用的是大尾端(big-endian)還是小尾端(little-endian)
utf-8:
utf-8 is a variable-width encoding that can represent every character in the unicode character set. it was designed for backward compatibility with ascii and to avoid the complications of endianess and byte order marks in
utf-16 and utf-32.
網際網路的普及,強烈要求出現一種統一的編碼方式。utf-8就是在網際網路上使用最廣的一種unicode的實作方式。其他實作方式還包括utf-16和utf-32,不過在網際網路上基本不用。重複一遍,這裡的關系是,utf-8是unicode的實作方式之一。
utf-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符号,根據不同的符号而變化位元組長度。
utf-8的編碼規則很簡單,隻有二條:
1)對于單位元組的符号,位元組的第一位設為0,後面7位為這個符号的unicode碼。是以對于英語字母,utf-8編碼和ascii碼是相同的。
2)對于n位元組的符号(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符号的unicode碼。
下表總結了編碼規則,字母x表示可用編碼的位。
unicode符号範圍 | utf-8編碼方式 (十六進制) | (二進制) --------------------+--------------------------------------------- 0000 0000-0000 007f | 0xxxxxxx 0000 0080-0000 07ff | 110xxxxx 10xxxxxx 0000 0800-0000 ffff | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 ffff | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面,還是以漢字“嚴”為例,示範如何實作utf-8編碼。
已知“嚴”的unicode是4e25(100111000100101),根據上表,可以發現4e25處在第三行的範圍内(0000 0800-0000 ffff),是以“嚴”的utf-8編碼需要三個位元組,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然後,從“嚴”的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,“嚴”的utf-8編碼是“11100100 10111000 10100101”,轉換成十六進制就是e4b8a5。
參考:
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#_4.accept-charset/accept-encoding/ac
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://en.wikipedia.org/wiki/utf-8
http://www.javacodegeeks.com/2010/11/java-best-practices-char-to-byte-and.html