淺談ASCII 、ISO8859-1、GB2312、GBK、Unicode、UTF-8 的區別。
首先,先科普一下什么是字符編碼。字符是指一種語言中使用的基本實體,比如英文中的26個英文字母,標點符號,以及中文中的一個個漢字,都可以算做一個字符。而字符編碼旨在將這些字符正確錄入計算機中,轉換成0101形式的計算機識別碼,嚴格意義來講字符編碼其實是一種規范。遵守這種規范的錄入編碼,會在編碼解碼中獲取正確的表示,不會出現亂碼。
ASCII:計算機發明自美國,自然最初的字符編碼規范是以英文為基礎的。錄入英文字符編碼標准:ASCII(American Stardard Code for Information InterChange 美國信息互換標准代碼),單字節編碼,使用單字節8位 前127個存儲英文字母及標點符號。
ISO8859-1:iso組織在ASCII基礎上做的擴展,也是單字節編碼。
GB2313:隨着發展,各國都需要使用各國的語言使用計算機,相應的,我國大陸地區采用雙字節 高低位字節的方式,存儲簡體中文。當存儲中文字符時,高低位都存放大於127的數字,當讀取高位字節時,若大於127,則認為是中文字符,將讀取雙字節進行識別,若小於127,則認為是英文字符,單字節識別。另外,GB2313在大於127位的編碼庫也提供了中文符號的編碼,故英文標點符號稱做半角符號,中文標點符號稱作全角符號。
GBK:對GB2313的拓展,雙字節編碼,區別是當存儲中文字符時,高位存放大於127的數字,低位不再是大於127的數字,將127之前的數字也囊括了。GBK將繁體中文也囊括進來。
Unicode:針對各個國家都使用不同的編碼機制,iso組織又站了出來,對全球編碼做了整個的囊括,推出了Unicode。Unicode,雙字節編碼,對ASCII采取高位補零的方式拓展。
UTF-8:由於Unicode是一組編碼映射,即一個字符映射一個16進制數字的形式。隨着互聯網發展,為了節省資源(無論是硬盤存儲還是流量),相應的對Unicode進行了不同的實現,這就是utf-8。UTF-8的編碼規則及詳細的映射Unicode詳見另一篇文章: Unicode 和 UTF-8 有何區別 :https://blog.csdn.net/u013314786/article/details/50979627
最后,嚴格意義來講,編碼之間無法轉碼,只有使用正確的編碼規范才能不出現亂碼的問題。統一編碼規范,開發時文件創建、代碼使用什么編碼,並標識文件編碼格式,訪問時根據不同的編碼格式,使用對應編碼才是王道。遇到編碼問題,從應用程序代碼編碼設置、jsp頁面編碼設置、應用部署服務器編碼設置、應用部署環境系統編碼設置、瀏覽器編碼設置等這些方面入手,查找是哪一環節的編碼設置錯誤。
