完全理解編碼

只要涉及編程工做,編碼是永遠繞不開的問題。只有完全理解編碼,遇到編碼問題才知道問題的根源在哪裏,並找到對應的解決辦法。花一點時間去完全消化並理解他,長遠來看,對之後工做效率的提高是很是值得的。下面是我對編碼的一些總結和理解,有不對之處還望指正。html

1. 什麼是編碼?爲何會有編碼(可參考這裏)?

從根本上來講,計算機只能處理01,也就是說只能處理由0和1組成的一串串數字。讓人直接用01數字給計算機下達指令或傳輸字符顯然是很困難的;但其實,早期計算機剛興起時,那時的程序員就是寫好01代碼傳給機器執行的。java

人用天然語言溝通,而計算機只處理01代碼。爲了人與計算機更友好的交互,有人想了辦法,將天然語言的每一個字符都用一串01數字串來表示,也就是對每一個字符用01串來編碼,好比A用0100 0001來表示,這樣就能夠制定一個字符與01數字串的對應表,也即編碼表,人只須要輸入天然語言(如:Hello),計算機經過查編碼表就能夠轉換爲01串,這樣機器就能夠理解並處理了。程序員

2. 爲何會有多種編碼?

衆所周知,世界上第一臺計算機是在美國誕生的,所以,第一種編碼天然是解決英文和01串的對應關係,這就促生了ASCII編碼的出臺,ASCII編碼表用一個字節(8位)包含大小字母、數字、標點符號以及控制字符。編程

隨着計算機的普及,世界上開始有愈來愈多的國家使用計算機,然而,每一個國家都有本身的一套語言,加起來的字符成千上萬。而ASCII最多隻能編碼256個字符,已經不能知足這麼多的需求。因而,各國就制定了本身國家的編碼表。好比中國就制定了GB23十二、GBK、GB18030等編碼規範。每一個國家都有本身的一套編碼,這就致使同一串01數字可能表明兩個國家不一樣的字符,或者同一個字符A,在兩個國家分別用不一樣的01數字串表示。這就致使不一樣編碼的系統互相傳輸信息時沒法正確識別,好比中國用GBK編碼的字符傳輸給美國的服務器,而美國服務器只有ASCII編碼表,這就很糟糕。瀏覽器

因而,Unicode編碼出現了。Unicode編碼將世界上各個國家全部的字符所有收錄進去,每一個字符都用惟一的01字符串表示,這樣的話就作到了全世界全部字符的統一編碼,各個國家傳輸信息都用Unicode編碼,根據Unicode編碼表就能夠識別了。服務器

經常使用的編碼
  • ASCII:1個字節,實際使用7位,第8位保留,表示英文字符
  • ISO-8859-1:1個字節,ASCII的升級版,在ASCII的基礎上添加了歐洲國家的字符,不能表示中文,經常使用於Java服務的網絡傳輸
  • GB2312:2個字節,收錄6763個漢字,只能表示簡體字
  • GBK:GB2312的升級版,1個或2個字節,收錄21003個漢字,能夠表示簡體字和繁體字
  • Unicode(即UCS):原始的Unicode是定長的4個字節,好比字母A,用Unicode表示須要4個字節,比ASCII多了3個字節,因爲這樣作太浪費空間,所以通過優化制定了變長表示字符的UTF編碼。網絡

    • UTF-8:用1-6個字節表示全部字符,此處使用變長字節表示,優先使用短字節。
    • UTF-16:用二、4個字節表示全部字符,此處使用變長字節表示,優先使用短字節。
    • UTF-32:用4個字節表示。
編碼和解碼
  • 編碼:將字符轉爲二進制(或unicode)。
  • 解碼:將二進制(或unicode)轉爲字符。
不一樣編碼轉換

首先應該知道,內存統一用Unicode編碼,編碼轉換都統一轉到Unicode,再從Unicode轉爲其餘編碼。好比ISO-8859-1和UTF-8之間轉換,流程以下:post

  1. 先知道字符"u"是用ISO-8859-1編碼
  2. 獲取字符"u"的二進制,java可經過getByte("ISO-8859-1")正確解析出該字符的二進制,也能夠用十六進制表示,好比AF8U
  3. 根據某種規則,將ISO-8859-1的AF8U轉化Unicode,再轉化爲UTF-8的4E2D
java編譯的編碼問題(可參考這裏):
  1. JDK先檢查源文件的編碼類型,若是沒有指定編碼類型則用系統的編碼讀取源文件,若是指定了編碼類型則用指定的編碼類型打開源文件。
  2. 打開源文件後,在內存中編譯爲.class文件,此時,.class文件是Unicode編碼
  3. 將內存中的.class文件存入硬盤,此時,.class文件仍然是Unicode編碼
瀏覽器編碼問題
  1. 看瀏覽器使用的是什麼編碼,則顯示的頁面就是使用什麼編碼。
  2. 發送post請求時,看瀏覽器用的什麼編碼,則發送過去的數據就是用什麼編碼
  3. 通常能夠查看headers裏ContentType,charset是什麼編碼
服務器編碼問題(可參考這裏
  1. 服務器收到請求後,通過正確的編碼規則解析,服務器才能夠正常識別
  2. 服務器發送請求時,通過正確的編碼規則編碼,瀏覽器才能夠正常顯示。瀏覽器也能夠自定義編碼去解析

記住: 不論是爬蟲獲取的,瀏覽器收到的仍是從本地硬盤讀取的,都是二進制,選擇正確的編碼類型,才能把二進制或者說01序列解析爲正確的字符。也就是用何種方式解析01數字。優化

相關文章
相關標籤/搜索