為什麼要有UTF-8的疑問?

我知道unicode是用兩個位元組來表示世界上所有的字元,而後UTF-8是把unicode中字元的編碼按照一定規律進行轉換,變成另外一套編碼,這是我目前的理解,但為什麼要有UTF-8呢?網上有說是為了網路傳輸什麼的,我不理解.unicode也是8八個位元組,也可以網路傳輸呀,為啥轉換為utf-8後再傳輸呢


1. 根據 utf-8 的編碼規則,從 utf-8 位元組流任何一個地方截斷都可以跳過非法的部分找到下一個字的開頭,如果是 unicode 如果從一個字的中間截斷會導致接下來所有的字元解析都是錯的,這在不夠可靠的網路傳輸中是有利的。

2. 現有的 unicode 標準不是用 2 個位元組而是 3 個位元組(最大 21 位)。而 utf-8 則是變長的,對於英文字元,一個位元組就夠了,而網路上傳輸的大部分為英文字元,所以 utf-8 更節省存儲空間和寬頻。


我用我專欄里的一篇文章來回答題主的這個問題:

專欄鏈接:給妹子講python,歡迎大家關注,提意見!

既然提到了Unicode編碼,為什麼又有UTF-8編碼方案呢?其實我們常常混淆了兩個概念,即字元代碼字元編碼,字元代碼是特定字元在某個字符集中的序號,而字元編碼是在傳輸、存儲過程當中用於表示字元的以位元組為單位的二進位序列。ASCII編碼系統中,字元代碼和字元編碼是一致的,比如字元A,在ASCII字符集中的序號,也就是所謂的字元代碼是65,存儲在磁碟中的二進位比特序列是01000001(0X41,十進位也是65),另外的,如在GB2312編碼系統中字元代碼和字元編碼的值也是一致的,所以無形之中我們就忽略了二者的差異性。而在Unicode標準中,我們目前使用的是UCS-4,即字符集中每一個字元的字元代碼都是用4個位元組來表示,其中字元代碼0~127兼容ASCII字符集,一般的通用漢字的字元代碼也都集中在65535之前,使用大於65535的字元代碼,即需要超過兩個位元組來表示的字元代碼是比較少的。因此,如果仍然依舊採用字元代碼和字元編碼相一致的編碼方式,那麼拉丁字母原本僅需一個位元組編碼,目前就需要4個位元組進行編碼,漢字原本僅需兩個位元組進行編碼,目前也需要4個位元組進行編碼,這對於存儲或傳輸資源而言是很不划算的。因此就需要在字元代碼和字元編碼間進行再編碼,這樣就引出了UTF-8、UTF-16等編碼方式。基於上述需求,UTF-8就是針對位於不同範圍的字元代碼轉化成不同長度的字元編碼,同時這種編碼方式是以位元組為單位,並且完全兼容ASCII編碼,即0X00-0X7F的字元代碼和字元編碼完全一致,也是用一個位元組來編碼ASCII字符集,而常用漢字在Unicode中的字元代碼是4E00-9FA5,在文末的對應關係中我們看到是用三個位元組來進行漢字字元的編碼。UTF-16同理,就是以16位二進位數為基本單位對Unicode字符集中的字元代碼進行再編碼,原理和UTF-8一致。

因此,我們可以看出,在目前全球互聯的大背景下,Unicode字符集和編碼方式解決了跨語言、跨平台的交流問題,同時UTF-8等編碼方式又有效的節約了存儲空間和傳輸帶寬,因而受到了極大的推廣應用。

希望對題主有幫助。

附表:

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


簡單來說,unicode是字元的標識,但不是字元在計算機上的標識;utf-8則是解決字元如何在計算機上標識的一種方式,還有其他的方式,比如說utf-16,GBK等等。


1. 兼容ASCII

2. 任何一個byte漏傳,多傳,傳錯隻影響當前字元,前後字元都不受影響。byte stream從某個字元編碼的中間截斷不會導致後續字元解碼出錯。

3. 類似哈夫曼編碼,越常用的字元處在編碼長度越短的編碼平面上。起到一定的壓縮作用。


最主要的目的是兼容ascii,因為以前的數據基本上是ascii,進入unicode時代之後,和原來英語係數據不兼容,因為都是ascii為主。utf8 是完全兼容的


推薦閱讀:

tomcat伺服器8.0版本對於request發出的請求是否默認按照utf-8編碼而不是之前的iso8859-1?
能否詳細介紹一下字元編碼的發展歷史?
」手機複製這幾個字看你多久能刪完」這句話有什麼秘密能讓人刪不完?
Unicode與bytes有何區別?
程序如何區分該顯示中文字元或英語字元?

TAG:Unicode統一碼 | 字元編碼 | UTF-8 |