Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Unicode 和 UTF-8 有何區別?,unicodeutf-8

Unicode 和 UTF-8 有何區別?,unicodeutf-8

編輯:關於android開發

Unicode 和 UTF-8 有何區別?,unicodeutf-8


Unicode符號范圍 (一個字符兩個字節)     | UTF-8編碼方式

(十六進制)                   | (二進制)
—————————————————————–

    這兒有四個字節
從-----00 00 00 00---到----00 00 00 7F | 0xxxxxxx                                                      一個字符需要一個字節
從-----00 00 00 80---到----00 00 07 FF | 110xxxxx 10xxxxxx              一個字符需要兩個字節
從-----00 00 08 00---到----00 00 FF FF | 1110xxxx 10xxxxxx 10xxxxxx          一個字符需要三個字節
從-----00 01 00 00---到----00 10 FF FF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx   一個字符需要四個字節 



    舉一個例子:   It's 知乎日報
你看到的unicode(字符集)是這樣的編碼表:
I 0049
t 0074
' 0027
s 0073
  0020
知 77e5
乎 4e4e
日 65e5
報 62a5
每一個字符對應一個十六進制數字。

計算機只懂二進制,因此,嚴格按照unicode的方式(UCS-2),應該這樣存儲:
I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
  00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
報 01100010 10100101
這個字符串總共占用了18個字節,但是對比中英文的二進制碼,可以發現,英文前9位都是0!浪費啊,浪費硬盤,浪費流量。

怎麼辦?

UTF。

UTF-8(編碼方式)是這樣做的:

1. 單字節的字符,字節的第一位設為0,對於英語文本,UTF-8碼只占用一個字節,和ASCII碼完全相同;

2. n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,後面字節的前兩位都設為10,這n個字節的其余空位填充該字符unicode碼,高位用0補足。

這樣就形成了如下的UTF-8標記位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...

於是,”It's 知乎日報“就變成了:
I 01001001
t 01110100
' 00100111
s 01110011
  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
報 11100110 10001010 10100101
和上邊的方案對比一下,英文短了,每個中文字符卻多用了一個字節。但是整個字符串只用了17個字節,比上邊的18個短了一點點。

下邊是課後作業:

請將”It's 知乎日報“的GB2312和GBK碼(自行google)轉成二進制。不考慮歷史因素,從技術角度解釋為什麼在unicode和UTF-8大行其道的同時,GB2312和GBK仍在廣泛使用。

劇透:一切都是為了節省你的硬盤和流量。 做個簡單的比喻, unicode相當於中文, UTF-8, UTF-16等相當於 行書, 楷書, 草書等各種書寫方式.          

例子一:
String s ="abc中文喆镕";
byte[] a;
a=s.getBytes();
System.out.println("默認:"+Arrays.toString(a));
a=s.getBytes("GBK");
System.out.println("GBK:"+Arrays.toString(a));
a=s.getBytes("UTF-8");
System.out.println("UTF-8:"+Arrays.toString(a));
輸出:
默認:[97, 98, 99, -42, -48, -50, -60, -122, -76, -23, 70]
GBK:[97, 98, 99, -42, -48, -50, -60, -122, -76, -23, 70]
UTF-8:[97, 98, 99, -28, -72, -83, -26, -106, -121, -27, -106, -122, -23, -107, -107]

例子二:
String s;
byte[] a;
a=new byte[]{97, 98, 99, -42, -48, -50, -60, -122, -76, -23, 70};
s=new String(a);
System.out.println(s);
a=new byte[]{97, 98, 99, -42, -48, -50, -60, -122, -76, -23, 70};
s=new String(a,"GBK");
System.out.println(s);
a=new byte[]{97, 98, 99, -42, -48, -50, -60, -122, -76, -23, 70};
s=new String(a,"UTF-8");
System.out.println(s);
a=new byte[]{97, 98, 99, -28, -72, -83, -26, -106, -121, -27, -106, -122, -23, -107, -107};
s=new String(a,"UTF-8");
System.out.println(s);
輸出:
abc中文喆镕
abc中文喆镕
abc??????
abc中文喆镕

        Unicode 與 GBK 是兩個完全不樣的字符編碼方案, 其兩者沒有直接關系, 要對其進行相
互轉換, 最直接最高效的方法是查表.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved