今天在看一些面試題目的時候忽然看到關於字符編碼的問題,想到本身也會常常遇到這個問題,每次都是去網上直接搜索答案,並不明白其中的原理,此次就完全的花了一下午的時間去了解關於字符編碼的問題,看完以後以爲收穫頗多,這篇文章就來簡單講解下個人學習過程,但願能幫助到你們。html
ASCII(American Standard Code Information Interchange,美國信息交換標準代碼),是基於拉丁字母的一套計算機編碼系統,它主要用於顯示現代英語。(解釋來源於wiki)java
ASCII是一種單字節編碼的編碼系統,迄今爲止它定義了128個字符,咱們知道單字節總共有八位(ox00-oxFF),但128個字符只會用到七位,咱們就規定最前面一位爲0,下圖中截取了部分ASCII編碼的映射關係面試
缺點:ASCII編碼只能表示128個字符,那對於一些其餘國家的語言,好比法語字母上方是有標註的,因而一些歐洲國家就決定使用空閒下來的最高位編碼歸入新的符號,比圖法語中à的編碼爲129,這樣一來這些歐洲國家使用的ASCII就能夠表示256個字符,這樣就衍生出了EASCII(Extended ASCII,延伸美國標準信息交換碼),EASCII碼比ASCII碼擴充出來的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號。算法
可是這樣又出現了新的問題,不一樣的國家用的語言可能不一樣。所以256個字符來編碼確定是不夠的,至於亞洲國家來講更是如此,光漢字就有10萬個左右,一個字節最多隻能表示256個字符,**那就必需要使用多字節編碼來表示,**這樣就急需統一不一樣國家的一些字符,以便於整個計算機的發展和推廣。Unicode編碼方式的出現就解決了這個問題。學習
Unicode是計算機科學領域裏的一項行業標準,它對世界上大多數的文字系統進行了整理、編碼,使得計算機能夠更簡單的處理和顯示這些文字。編碼
Unicode編碼旨在收集全球全部的字符。爲每一個字符分配一個惟一的字符編碼即代碼點(code-point),用U+後面跟着的十六進制數表示。全部字符按照使用的頻率被分爲17個平面(編號爲0-16),即基本多語言平面和增補平面。基本多語言平面又稱平面0,收集了最爲普遍的字符,代碼點從U+0000到U+FFFF,每一個平臺有216=65536個碼點;增補平面從1~16,每一個增補平面也是216=65536個碼點,總共有17*65536=1114112個碼點,下圖就是Unicode碼點在平面的分佈。spa
例如中文張
用Unicode編碼爲U+5F20
,換成二進制0101111100100000
,也就是說中文張
至少須要兩個字節。若是表示其餘更大的字符可能須要3個字節、四個字節甚至更多。code
這時一個很嚴重的問題就出現了,如何區分ASCII和unicode,計算機怎麼區分編碼的分界點,怎麼知道三個字節長度的編碼的究竟是三個單字節仍是一個單字節加上一個雙字節,若是將長度固定爲三字節或者四字節那對於英文字母來講前幾個字節都是0,會形成空間的極大浪費(3-4倍),這是沒法接受的,Unicode很脹一段時間沒法推廣,直到互聯網的出現。orm
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的長度可變的字符編碼,也是一種前綴碼。通常用1-4個字節來表示Unicode字符,也是目前應用最普遍的一種Unicode編碼方式。UTF-8編碼算法有如下幾個特色:cdn
首字節碼用來表示編碼的字節數:若是首字母是0開頭,則表示單字節編碼;若是以110開頭,則表示兩個字節編碼;若是以1110開頭,表示三個字節編碼,以此類推。
除了首字節編碼外,用10開頭表示多字節編碼的後續字節,以下圖表示了從unicode編碼轉化爲UTF-8編碼的規則。
下面我將簡單舉個例子來講明一個unicode編碼怎麼轉化爲UTF-8編碼:
中文引
的Unicode爲U+5F15
(0101 1111 0001 0101
)有效比特位是16,根據上面的編碼規則知足第三行的規則,所以按照1110xxxx 10xxxxxx 10xxxxxx
的規則最後獲得引
的UTF-8編碼爲11100101 10111100 10010101,轉化爲十六進制爲D5BC95,紅色的部分就是引
的Unicode編碼。
以上都是一些關於經常使用編碼方式的發展過程以及他們的一些原理解析,可能並不夠徹底解決亂碼的問題,其實編碼方式是一件極其複雜的問題。每一個國家都有本身特定的文字系統,在計算機剛剛發展的那些年,不少國家都提出瞭解決本身國家文字的編碼方式,且並不能與其餘國家的相兼容,因此常常會遇到一些亂碼的問題,咱們常常在郵件中看到的亂碼就是因爲發送者和接受者的編碼方式不一樣致使的。隨着近些年互聯網的興起,你們開始使用統一的UTF8編碼,亂碼問題可能會出現的更少了。
參考內容: