字符,字符集,字符編碼,編碼頁,字體

吾國碼農(nóng)應該都遇到過亂碼的問題,然后網(wǎng)上搜索一番添加一些設置,亂碼就消失了,也不繼續(xù)追究本質(zhì)。
本文試圖講清楚標題提到的概念,從此遇到亂碼從容應對。

字符(character),就是【a】,【A】,【請】等書寫符號。
字符集(character set),通常就是某種語言字符集合,比如英語就是ascll字符集,中文有GBK等

注意,不是每種語言只對應一種字符集(比如GB2312 ,GBK,GB18030都包含了常用漢字,后者是前者的超集),而且字符集也不是只對應一種語言,例如Unicode字符集就包含所有語言字符,字符集只是設計者為了給字符編碼(Code Point/Numbering)設計編碼時,為了收錄到命名的字符集合,但是通常設計者都為字符集設計了對應的編碼規(guī)范。

字符編碼(character code point),給字符集里的字符編號
編碼頁(code page),在unicode發(fā)明之前,各個地區(qū)都用2字節(jié)編碼自己的字符集,相同的編碼對應不同的字符,為了本地化,windows發(fā)明了編碼頁,來對應不同的字符集。
字符編碼(character encoding),對給定的字符編碼(code point)編碼成字節(jié)表示(byte sequence)

早期,字符被編號后,存儲時就按照編號的方式存儲,沒有encoding的過程,后來發(fā)明Unicode后,發(fā)現(xiàn)如果按照Unicode的編號直接存儲的話,對于英文字符就有很大存儲浪費,因為任意字符都需要2字節(jié)存儲,后來人們發(fā)明UTF-8這種編碼方式,這樣UTF-8就可以一個字節(jié)表示英文字符,2個以上字節(jié)表示漢字字符。

字體(Font),定義了字符的圖形表示,現(xiàn)在的軟件展示字符時用Unicode表示,字體是Unicode編碼和字符圖形的映射,而以往比如WindowsCMD控制臺,沒有對應Unicode,則用編碼頁來區(qū)分,所以字體就是字符編碼金和代碼頁到字符圖形的映射。

相同字符的不同字體,顯示圖形不一樣。字體通常與具體的字符集相關,因為字體是針對某一字符集設計的。如果用表示日語的字體顯示中文,就會發(fā)現(xiàn)不一致,中日都有的漢字正常顯示,日文沒有的漢字,就有點怪(其實是編輯器嘗試用其他字體顯示的原因)。另外可以看出,字體與具體編碼無關,不同編碼的同一字符,用相同字體顯示是一樣的圖形。只是字符集通常與字符編碼用相同的名稱表示,容易混淆,比如GB2312,即是字符集,又是字符編碼。

好了,現(xiàn)在我們可以想象,文本文件存儲在磁盤上,都是一系列的bytes,如果不告訴文本編輯器該文件的encoding,編輯器會嘗試用默認的編碼(依賴于操作系統(tǒng)設置)又或者自己探測(detect,比如文件開頭有FFEF或者EFFF字節(jié)就表明UTF-16編碼,有很多10,110開頭的字節(jié),很可能是UTF-8編碼)并嘗試decode,如果沒有猜對,那就會顯示亂碼。

下面我們通過文本編寫,保存/傳輸以及瀏覽器顯示來了解一下亂碼可能的原因以及解決辦法。
我們用輸入法在notepad輸入文字,輸入法首先產(chǎn)生Unicode編碼在內(nèi)存,當我們保存時編輯器首先嘗試用系統(tǒng)默認的編碼保存,當我們輸入的字符不包含在本地編碼對應的字符集時,就會收到類似提示:文本包含Unicode字符,如果繼續(xù)保存則丟失信息,請選擇unicode方案保存。此時一定要選擇unicode方案保存,否則信息丟失就回天無力。
好了,接下來我們要傳輸文本到瀏覽器,一般我們只是簡單的傳輸文件(2進制流傳輸)而不對文件進行轉碼,但是瀏覽器不知道文件的編碼就有可能顯示亂碼,所以我們需要通過http頭的Content-Type: text/plain; charset=”UTF-8″來告訴瀏覽器用正確的編碼來解析。所以如果瀏覽器顯示亂碼,就有一下幾種可能
1,沒有content-type頭,瀏覽器默認的編碼與實際不同,嘗試調(diào)整瀏覽器編碼可以解決
2,有content-type頭,但是與實際文件編碼不同,重新制定content-type頭,或者傳送文件內(nèi)容之前對文件按照content-type頭制定的編碼進行轉碼在傳輸。
3,content-type和文件內(nèi)容都正確,還是亂碼,瀏覽器端根本安裝沒有對應的字符集,安裝相應的語言(同時會安裝相應的字符集,編碼,字體等)。

參考
https://www.w3.org/International/questions/qa-what-is-encoding
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
https://wenku.baidu.com/view/cb9fe505cc17552707220865.html
https://blogs.msdn.microsoft.com/shawnste/2005/03/15/whats-the-difference-between-an-encoding-code-page-character-set-and-unicode/
https://www.zhihu.com/question/21721472

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容