
一、ASCII 碼
我們知道,計算機內部,所有資訊最終都是一個二進制值,每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個位元組(byte),
也就是說,一個位元組一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從00000000到11111111,
上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定,這被稱為 ASCII 碼,一直沿用至今,
ASCII 碼一共規定了128個字符的編碼,比如空格SPACE是32(二進制00100000),大寫的字母A是65(二進制01000001),
這128個符號(包括32個不能列印出來的控制符號),只占用了一個位元組的后面7位,最前面的一位統一規定為0,
二、非 ASCII 編碼
英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的,比如,在法語中,字母上方有注音符號,它就無法用 ASCII 碼表示,
于是,一些歐洲國家就決定,利用位元組中閑置的最高位編入新的符號,比如,法語中的é的編碼為130(二進制10000010),
這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號,
但是,這里又出現了新的問題,不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣,
比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (?),在俄語編碼中又會代表另一個符號,
但是不管怎樣,所有這些編碼方式中,0--127表示的符號是一樣的,不一樣的只是128--255的這一段,
至于亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右,一個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組表達一個符號,
比如,簡體中文常見的編碼方式是 GB2312,使用兩個位元組表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號,
中文編碼的問題需要專文討論,這篇筆記不涉及,這里只指出,雖然都是用多個位元組表示一個符號,但是GB類的漢字編碼與后文的 Unicode 和 UTF-8 是毫無關系的,
三. Unicode
同一個二進制數字可以被解釋成不同的符號,
因此,要想打開一個文本檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼,為什么電子郵件常常出現亂碼?
就是因為發信人和收信人使用的編碼方式不一樣,
可以想象,如果有一種編碼,將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失,
這就是 Unicode,就像它的名字都表示的,這是一種所有符號的編碼,
Unicode 當然是一個很大的集合,現在的規模可以容納100多萬個符號,每個符號的編碼都不一樣,
比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字嚴,具體的符號對應表,可以查詢unicode.org,或者專門的漢字對應表,
五、UTF-8
互聯網的普及,強烈要求出現一種統一的編碼方式,UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實作方式,
其他實作方式還包括 UTF-16(字符用兩個位元組或四個位元組表示)和 UTF-32(字符用四個位元組表示),不過在互聯網上基本不用,
UTF-8 最大的一個特點,就是它是一種變長的編碼方式,它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度,
UTF-8 的編碼規則很簡單,只有二條:
1)對于單位元組的符號,位元組的第一位設為0,后面7位為這個符號的 Unicode 碼,因此對于英語字母,UTF-8 編碼和 ASCII 碼是相同的,
2)對于n位元組的符號(n > 1),第一個位元組的前n位都設為1,第n + 1位設為0,后面位元組的前兩位一律設為10,剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼,
七、Little endian 和 Big endian
以漢字嚴為例,Unicode 碼是4E25,需要用兩個位元組存盤,一個位元組是4E,另一個位元組是25,
存盤的時候,4E在前,25在后,這就是 Big endian 方式;25在前,4E在后,這是 Little endian 方式,
第一個位元組在前,就是"大頭方式"(Big endian),第二個位元組在前就是"小頭方式"(Little endian),
那么很自然的,就會出現一個問題:計算機怎么知道某一個檔案到底采用哪一種方式編碼?
Unicode 規范定義,每一個檔案的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(zero width no-break space),用FEFF表示,這正好是兩個位元組,而且FF比FE大1,
如果一個文本檔案的頭兩個位元組是FE FF,就表示該檔案采用大頭方式;如果頭兩個位元組是FF FE,就表示該檔案采用小頭方式,
另外如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習:

編程學習:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270706.html
標籤:其他
