第五章:其他

UTF

UTF-8/16/32,這裏面的阿拉伯數字到底代表什麼含義呢?

UTF8中的8代表最小以8位爲一個代碼單元即1個字節。

UTF16代表最小用16位爲一個代碼單元即2個字節。

UTF32則以32位爲一個代碼單元即4個字節。

這些代碼單元是最小單位,不能分割,因此,具體位數只能是某個代碼單元的整數倍。

代碼單元有什麼用呢,這裏以java語言中的String來舉例:

String在內存中以UTF-16方式來存儲,而UTF-16那麼2個字節,要麼4個字節(即要麼1個代碼單元存儲,要麼2個代碼單元存儲),再來看看str.length的屬性定義爲:長度等於Unicode代碼單元的數量。

Unicode一共有17個Plane,而Plane0(BMP)一共有65536個碼點,如果我用UTF-16存儲的話,相當於常見的字符(比如ASCII)只用2個字節存儲即可,而在UTF16中2個字節恰恰是1個代碼單元,所以,單個字母的長度就是1。

而遇到代理對的時候則採用4字節即2個代碼單元。

Bom

當時在濟南工作的時候,遇到一個問題,解析TXT的時候總是無法正常解析,後來問了問領導,領導說你編碼多少,我說是UTF8,領導又說你另存爲的時候注意UTF-8選項有2種:UTF-8、UTF-8無BOM,這是我第一次瞭解到BOM這玩意。

假如有個UTF-16的2個編碼:0X0045,0X3F50。如果按照高位在前的書寫方式爲:00 45 3F 50,這種書寫方式叫做大端法。

如果按照低位在前的書寫方式爲:45 00 50 3F,這種書寫方式叫做小端法。

爲什麼會存在2種不同的書寫方式呢?其實這跟在內存中的存儲有關,例如:

書寫方式

內存地址從左向右依次遞增

大端法

00

45

3F

50

小端法

45

00

50

3F

大端法中,高位字節放到了低地址,低位字節放到了高地址。而小端法恰恰相反。

而內存到底使用大端法,還是小端法取決於CPU的寄存器,目前很多電腦的CPU寄存器都是使用的小端法。

BOM就是來標記該編碼到底是採用小端法,還是大端法而出現的。其中

UTF-16 BE(Big Endian)的BOM是:FE FF

UTF-16 LE(Little Endian)的BOM是:FF FE

UTF-8的BOM是:EF BB BF

按 Unicode 組織的說法,UTF-8可帶、可不帶 BOM,不作強制要求,但不推薦用BOM,原因之一是爲與ASCII的兼容。UTF-8 也不存在所謂的大小端兩種情況,統一爲大端法,BOM 僅僅作爲一種所用編碼的指示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章