ASCII、 Unicode 和 UTF8
- ASCII: 英文字母與數字編號的一一對應。每個英文字母對應一個編號。範圍0~127
- Unicode: 全世界所有語言中字符與數字編號的一一對應。也即為存在的每個字符指定一個唯一的編號。範圍為0~0x10FFFF。
所以,
ASCII與Unicode是類似的東西,都是為一個字符指定一個唯一的數字編號
只不過Unicode的範圍更大,能夠表示更多的字符。
在計算機的世界裏,只有數字,而不會有什麽字符。一個字符在計算機看來就是一個數字。ASCII與Unicode就是將字符與數字一一對應起來的映射。比如對於字符‘A‘,在計算機看來,它就是一個數字65。
當字符串被寫入文件時,也是將字符串中每個字符對應的數字編號保存在文件。
以上是ASCII和Unicode的相同點。那麽,二者有什麽區別?
一個顯著的區別是,對於同一段文本,二者保存到文件後占用的字節數不同。對於ASCII,每個數字編號占用一個字節。 而對於Unicode,每個編號則需要占用3個字節。因此對於同一段文本:‘abcd‘,采用ASCII格式保存時,文件的大小為4個字節。 采用Unicode保存時,文件的大小則為12個字節。
由此也可看出,當待保存文本為純英文字母時,
采用Unicode的存儲效率太低了
UTF8便是為了解決Unicode存儲效率低下而產生的。具體的規則就不講了,先來看一下UTF8能夠達到的效果。
對於相同的文本:‘abcd‘,Unicode需要12個字節,而UTF8只需要4個字節(和ASCII一樣,達到最優)。
UTF8之所以可以用一個字節存儲英文字母,是因此它使用了變長的編碼方式。也即,對於英文字母,它采用一個字節保存這個字符。對於英文字母之後的字符,它采用兩個字節保存這個字符。對於再之後的字符,采用三個字節保存。最多采用四個字節保存一個字符。
所以UTF8對於存儲英文字母的高效率來源於對之後字符保存效率的犧牲。這裏的合理性在於:如果待保存的文本中字符大多數為英文字母,則存儲效率能夠提高,因為大多數字符都是采用一個字節保存。
總結來說,
UTF8是對Unicode在存儲效率上的優化
以上便是三者的關系。
ASCII和Unicode都是為一個字符指定一個唯一的數字編號,Unicode能夠表達更多的字符,相當於是ASCII的擴展。Unicode存在存儲效率低下的問題,UTF8是在這個方面對Unicode的優化。
ASCII、 Unicode 和 UTF8