關(guān)鍵詞:
問(wèn)題來(lái)源
我們經(jīng)常會(huì)遇到中文亂碼問(wèn)題,也時(shí)常要絞盡腦汁去解決它。那么,當(dāng)我們把不同的字符輸入到電腦后,電腦程序到底怎么來(lái)理解它呢?電腦又是怎樣進(jìn)行的‘’字符的翻譯‘’,亂碼問(wèn)題到底出現(xiàn)在哪?為了解釋這些問(wèn)題,我們引入幾個(gè)例子來(lái)幫助理解。
示例一:用戶輸入的人機(jī)理解過(guò)程
用戶輸入的人機(jī)理解過(guò)程:
輸入——>鍵盤碼——>交換碼——>內(nèi)部碼——>地址碼——>字形碼——>輸出鍵盤碼:輸入設(shè)備(鍵盤,鼠標(biāo)等)對(duì)應(yīng)的系統(tǒng)鍵值或者經(jīng)過(guò)編碼后的acsii碼
交換碼:將接收的字符做計(jì)算機(jī)可支持的字符編碼,例如我們常用的utf-8,assii等。
內(nèi)部碼:將對(duì)應(yīng)已編碼的字符存儲(chǔ)為二進(jìn)制形式。
地址碼:實(shí)際的存儲(chǔ)地址,為二進(jìn)制形式。
字形碼:根據(jù)相應(yīng)原理或算法生成對(duì)應(yīng)輸入接受類型字符
示例二:查找不認(rèn)識(shí)的單詞的過(guò)程
從上面過(guò)程我們可以看出,亂碼出現(xiàn)在已接收字符進(jìn)行交換碼與內(nèi)部碼轉(zhuǎn)化的過(guò)程中,那我們想想英語(yǔ)小白在實(shí)際生活中遇到一個(gè)不認(rèn)識(shí)的單詞會(huì)怎么辦呢?
- 查找不認(rèn)識(shí)的單詞的過(guò)程
不認(rèn)識(shí)的單詞——>使用雙語(yǔ)字典查詢——>根據(jù)查詢規(guī)則獲得單詞位置——>根據(jù)位置找到該單詞實(shí)際示意
我們歸納上面的例子可以理解實(shí)際轉(zhuǎn)碼的要點(diǎn),即:
- 字庫(kù)表(character repertoire):可讀或者可顯示字符的集合,字庫(kù)表表示了整個(gè)字符集能夠展現(xiàn)表示的所有字符的范圍,例如中-英雙語(yǔ)所包含的字。
- 編碼字符集(coded character set):即用一個(gè)編碼值來(lái)表示一個(gè)字符在字庫(kù)中的位置,例如單詞在字典中的位置。
- 字符編碼(character encoding form):編碼字符集和實(shí)際存儲(chǔ)數(shù)值之間的轉(zhuǎn)換關(guān)系,例如不同字典規(guī)定的規(guī)則,按字母、詞性排序等。
示例三:字符編碼存在的意義
通過(guò)三要點(diǎn)歸納,大家有可能會(huì)發(fā)現(xiàn),字庫(kù)表對(duì)應(yīng)著字符的值,編碼字符集對(duì)應(yīng)著表中的的位置,這種鍵-值形式已經(jīng)能滿足電腦查詢的功能了,那么字符編碼存在的意義在哪呢?這其實(shí)很好理解,如果我們想要用一本字典查詢所有我們不知道的字符,這就要求我們的字典必須包含的范圍足夠大,內(nèi)容足夠多。可是對(duì)于我們上文提到的新單詞問(wèn)題而言,我僅僅需要解決一個(gè)很小的麻煩,僅僅需要一本中英雙語(yǔ)詞典就能搞定了。對(duì)于計(jì)算機(jī)和程序的使用也是類似,我只需要存儲(chǔ)我需要且常用的字典,而不需要將偌大的字典存進(jìn)來(lái)消耗我的內(nèi)存和查詢時(shí)間。而字符編碼就解決詞典切分和其他規(guī)則定義的需求。
常用的字符集與字符編碼
通過(guò)上面的舉例,相信大家對(duì)兩者一有了明確的認(rèn)識(shí),那我就列舉出常見的字符表與字符編碼。
- 字符集/字符編碼:ASCII字符集/ASCII編碼、GBxxxx字符集/GBxxxx編碼、BIG5字符集/BIG5編碼、Unicode字符集/UTF-32 UTF-16 UTF-8編碼等。
亂碼出現(xiàn)的原因
用了不相對(duì)應(yīng)的編碼與解碼方式,導(dǎo)致對(duì)同一字符進(jìn)行不同的翻譯解釋。所以,在實(shí)際操作過(guò)程中,盡量先弄明白輸入與輸出的編碼方式,同時(shí)檢查你編碼文件的默認(rèn)打開編碼方式,這樣能一定程度上幫你解決亂碼問(wèn)題。