摘要:只有徹底理解編碼,遇到編碼問題才知道問題的根源在哪里,并找到對應的解決辦法。花一點時間去徹底消化并理解他,長遠來看,對以后工作效率的提升是非常值得的。比如中國就制定了等編碼規范。
只要涉及編程工作,編碼是永遠繞不開的問題。只有徹底理解編碼,遇到編碼問題才知道問題的根源在哪里,并找到對應的解決辦法。花一點時間去徹底消化并理解他,長遠來看,對以后工作效率的提升是非常值得的。下面是我對編碼的一些總結和理解,有不對之處還望指正。
1. 什么是編碼?為什么會有編碼(可參考這里)?從根本上來說,計算機只能處理0和1,也就是說只能處理由0和1組成的一串串數字。讓人直接用01數字給計算機下達指令或傳輸字符顯然是很困難的;但其實,早期計算機剛興起時,那時的程序員就是寫好01代碼傳給機器執行的。
人用自然語言溝通,而計算機只處理01代碼。為了人與計算機更友好的交互,有人想了辦法,將自然語言的每個字符都用一串01數字串來表示,也就是對每個字符用01串來編碼,比如A用0100 0001來表示,這樣就可以制定一個字符與01數字串的對應表,也即編碼表,人只需要輸入自然語言(如:Hello),計算機通過查編碼表就可以轉換為01串,這樣機器就可以理解并處理了。
2. 為什么會有多種編碼?眾所周知,世界上第一臺計算機是在美國誕生的,因此,第一種編碼自然是解決英文和01串的對應關系,這就促生了ASCII編碼的出臺,ASCII編碼表用一個字節(8位)包含大小字母、數字、標點符號以及控制字符。
隨著計算機的普及,世界上開始有越來越多的國家使用計算機,然而,每個國家都有自己的一套語言,加起來的字符成千上萬。而ASCII最多只能編碼256個字符,已經不能滿足這么多的需求。于是,各國就制定了自己國家的編碼表。比如中國就制定了GB2312、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:用2、4個字節表示所有字符,此處使用變長字節表示,優先使用短字節。
UTF-32:用4個字節表示。
編碼:將字符轉為二進制(或unicode)。
解碼:將二進制(或unicode)轉為字符。
首先應該知道,內存統一用Unicode編碼,編碼轉換都統一轉到Unicode,再從Unicode轉為其他編碼。比如ISO-8859-1和UTF-8之間轉換,流程如下:
先知道字符"u"是用ISO-8859-1編碼
獲取字符"u"的二進制,java可通過getByte("ISO-8859-1")正確解析出該字符的二進制,也可以用十六進制表示,比如AF8U
根據某種規則,將ISO-8859-1的AF8U轉化Unicode,再轉化為UTF-8的4E2D
JDK先檢查源文件的編碼類型,如果沒有指定編碼類型則用系統的編碼讀取源文件,如果指定了編碼類型則用指定的編碼類型打開源文件。
打開源文件后,在內存中編譯為.class文件,此時,.class文件是Unicode編碼
將內存中的.class文件存入硬盤,此時,.class文件仍然是Unicode編碼
看瀏覽器使用的是什么編碼,則顯示的頁面就是使用什么編碼。
發送post請求時,看瀏覽器用的什么編碼,則發送過去的數據就是用什么編碼
一般可以查看headers里ContentType,charset是什么編碼
服務器收到請求后,經過正確的編碼規則解析,服務器才可以正常識別
服務器發送請求時,經過正確的編碼規則編碼,瀏覽器才可以正常顯示。瀏覽器也可以自定義編碼去解析
記住: 不管是爬蟲獲取的,瀏覽器收到的還是從本地硬盤讀取的,都是二進制,選擇正確的編碼類型,才能把二進制或者說01序列解析為正確的字符。也就是用何種方式解析01數字。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77886.html
摘要:只有徹底理解編碼,遇到編碼問題才知道問題的根源在哪里,并找到對應的解決辦法。花一點時間去徹底消化并理解他,長遠來看,對以后工作效率的提升是非常值得的。比如中國就制定了等編碼規范。 只要涉及編程工作,編碼是永遠繞不開的問題。只有徹底理解編碼,遇到編碼問題才知道問題的根源在哪里,并找到對應的解決辦法。花一點時間去徹底消化并理解他,長遠來看,對以后工作效率的提升是非常值得的。下面是我對編碼的...
摘要:也就是說不僅是會產生這種問題,只要是采用的浮點數編碼方式來表示浮點數時,則會產生這類問題。到這里我們都理解只要采取的浮點數編碼的語言均會出現上述問題,只是它們的標準類庫已經為我們提供了解決方案而已。 Brief 一天有個朋友問我JS中計算0.7 * 180怎么會等于125.99999999998,坑也太多了吧!那時我猜測是二進制表示數值時發生round-off error所導致,但并不...
摘要:如果什么事都沒得做,它也不會死循環,它會將線程休眠起來,直到下一個事件來了再繼續干活,這樣的一個線程稱之為線程。而請求處理邏輯既可以使用單獨的線程池進行處理,也可以跟放在讀寫線程一塊處理。 Netty到底是什么 從HTTP說起 有了Netty,你可以實現自己的HTTP服務器,FTP服務器,UDP服務器,RPC服務器,WebSocket服務器,Redis的Proxy服務器,MySQL的P...
摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...
摘要:前言將數據報表導出,是數據報告展示常用的附帶功能。今天我們主要講的是直接通過前端將數據導出的格式的文件。但其實真正的答案應該是把相應的數據轉換成和。若是超過瀏覽器自身限制的最大長度,會導致下載失敗。 前言 將數據報表導出,是web數據報告展示常用的附帶功能。通常這種功能都是用后端開發人員編寫的。今天我們主要講的是直接通過前端js將數據導出Excel的CSV格式的文件。 原理 首先在本地...
閱讀 797·2021-09-06 15:02
閱讀 2438·2019-08-30 15:43
閱讀 2163·2019-08-30 11:26
閱讀 2371·2019-08-26 12:12
閱讀 3537·2019-08-23 18:24
閱讀 3253·2019-08-23 18:16
閱讀 694·2019-08-23 17:02
閱讀 2240·2019-08-23 15:34