字元編碼是從ASCII開始,那時候美國為瞭解決的字元問題,提出了ASCII碼。每個字元佔用一個位元組。但ASCII編碼實際只用了7位,空了一位。後來等電腦傳播開來,歐洲的各個國家出現了新的字元編碼的問題。如法國,出現了很多在英文字元上面加標記的字元,所有實際字元超過128種,但正好,一個位元組總共8位,原來ASCII原來不用的那一位就派上用場了。但是這使得歐洲的各個國家之間的字元編碼有衝突,也就是說前128位沒有問題,但是後面的128位在不同的國家表示的字元就不一樣,使得各國之間資訊交換有障礙。而這個障礙在電腦引入亞洲乃至全世界的時候變得越來越嚴重,阻礙了國際間的資訊交流。那麼如何解決呢?
其實也很簡單,只要字元編碼的位元提升到能夠容納世界上所有的字元就可以了。unicode碼應運而生。但是要知道每個字元要佔4個位元組。這對於美國和歐洲國家是難以接受的。因為美國等國家用到的字元只需要一個位元組就可以表示了。而unicode碼卻要讓這些國家浪費3/4的資源。這是讓美國等國家難以接受的!
所以unicode碼的utf-8表示形式很好的解決了這個問題。當然還有utf-16,utf-32這裡就不討論了。
utf-8是這樣編碼的,總共兩種情況。假設該字元的utf-8編碼佔n個位元組。
1:如果n=1,則位元組的第一位為0,後面的就是填充其unicode編碼。
2:如果n>1,則將第一個位元組的前n位置為1,將n+1位置為0。然後後面的每個位元組的前兩位為10。其他位填充其unicode編碼。
由上面的定義可以看出utf-8使用的還是unicode編碼,只是是一種變體,將unicode編碼中的無效位去除了。所以utf-8是unicode編碼的一種。
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-8編碼是如何產生的?
“嚴”的unicode是4E25(100111000100101),可以看到其unicode符號範圍屬於0000 0800-0000 FFFF,那麼我們應該採取第三種形式1110xxxx 10xxxxxx 10xxxxxx,然後將100111000100101填充到x的地方,就得到了“嚴”的utf-8編碼如下:
11101001 10111000 10100101。
windows的notepad本身就提供四種編碼方式:
1:ASCII
2:unicode
3:unicode-big endian//表示大端序
4:utf-8
需要注意的是:unicode編碼的檔案都以兩個字元表示端序,FEFF表示大端序,以FFFE表示小端序。如何理解呢?
例如“嚴”的unicode是4E25,如果其儲存形式也是4E25,那麼表示高位在第一個位元組則就是大端序。
我們因特爾處理器多採用的小端序。