在這裡主要記錄一下字符集與編碼這兩個概念,因為在日常程式設計當中很容易把這兩個概念弄混掉。對這兩個概念做澄清也有利於在程式設計當中對亂碼問題的解決。
首先來說一下什麼字符集。其實字符集是乙個抽象的概念,例如我們可以把所有的英文本母稱為乙個字符集,同樣的,所有的中文字元也可以稱為乙個字符集,或者將人類所有語言中的所有字元稱為乙個字符集。之所以稱之為是抽象的,是因為同乙個字元可能有很多中不同的表現形式,例如我們在電腦螢幕上看到的「a」,其實是「a」這個字元的乙個中具體的表現形式,可以理解為是「a」的圖形化表示,當我們說出「a」時,就是用來字元「a」的另外一種表現形式,也就是聲音的表現形式。為了能夠以統一的方式表示字符集,人們就對字符集進行了編碼,unicode就是一種對字符集的編碼形式,稱之為編碼字符集。在unicode中,為每乙個不同的字元都分配了乙個唯一的整數,用來便是這個字元。而這種編碼字符集的數量不會太多,現在普遍使用的就是unicode這種編碼字符集。
接著,再來說一下編碼。雖然unicdoe為每乙個字元都分配了乙個唯一的整數,但是這個整數在計算機中的儲存方式是可以多種多樣的。這裡就引申出來多種多樣的字符集編碼,像utf-8,gbk,utf-16等等。他們的作用就是規定如何將unicode中代表某個字元的整數以二進位制的形式儲存到計算機中。也就是說,字符集編碼要解決的問題是,用幾個byte來表示乙個整數以及這幾個byte中,高位儲存什麼,低位又儲存什麼等等問題?不同的字符集編碼都是從某個角度來思考如何方便、有效地將unicode中的字元編碼對映到計算機中去。例如utf-16就是以便長的方式將unicode中的某乙個字元對應的整數對映到成二進位制形式,這樣可以提高儲存的效率,但是並不保證二者的值是相等的。而utf-32則是原封不動地將unicode中的整數對映成二進位制形式。
之所以會有如此多不同的字符集編碼方式,其實是隨著計算機硬體不斷發展的結果,因為計算機中的一次能夠讀取的字長在不斷變化,因此也就出現來多種多樣的字符集編碼方式。當然,也有一些是考慮了如何提高字元儲存效率的,例如utf-16這樣的變長編碼方式。
字符集與編碼
前言 今天notepad 檢視測試傳過來的乙個log,開啟後竟然有部分亂碼,無法檢視完整資訊,嘗試更改編碼後仍未能解決,同事告知使用瀏覽器開啟或許可以,於是搗鼓一下,使用瀏覽器開啟並選擇編碼unicode utf 8 後終於正常顯示,順利解決問題。亂碼顯示的問題以前也經常遇到,從未認真對待過,剛好稱...
字符集與編碼
這些東西是自己在知乎上看的,摘抄下來,以便以後查閱,主要內容有 字符集與編碼 byte order mark等。在windows中經常需要用到多字元與寬字元的轉換方法,多字元 multichar 也就是ansi編碼的方式,而寬字元 widechar 也就是unicode編碼的方式。ansi是預設的編...
字符集與編碼
乙個位元 bit 可以是0,或者是1,8個位元 bit 組成乙個位元組 byte 全為0時代表數字0,全為1時代表數字255。乙個位元組可以表示256個數字,兩個位元組可以表示65536個數字。更多的位元組,可以有更多的組合,就可以表示更大的數值範圍。整數可以這麼存,那字元呢?一堆二進位制的0和1,...