常見各種編碼格式

一.ANSI

  1. 這裏,我將ANSI作爲一個大項。根據我自己的理解,ANSI並不是一種具體的編碼,而是一種字符代碼。比如:ASCII、GB2312、GBK、GB18030等都屬於ANSI的範疇。不過這樣說也不準確,根據我查閱的資料來看,ASCII是早於ANSI的,所以只能說ANSI是兼容ASCII的,而不能說ASCII是根據ANSI編碼所得。

  2. ASCII,他的全稱爲American Standard Code for Information Interchange,美國信息交換標準代碼。要知道,一個字節爲8位,而8位最多可以組合256種不同的狀態,用來保存英文、數字、符號完全夠用了,而事實上,ASCII只用了前128個字符。但是後來除了美國,其他的一些國家也使用了計算機,但是他們的文字並非都是這些字母,所以又使用了後面的128位,又叫:”擴展字符集“。

  3. MBCS:就目前我查閱的資料來看,MBCS是一種統稱,許多漢字的編碼都屬於MBCS,比如GB2312、GBK、GB18030等。因爲無論ASCII編碼如何擴展,也滿足不了中文,中文的字數太龐大了。MBCS支持中英文混用,英文的話就和ASCII一樣,中文的話就佔2個字節,GB2312的字數最少,其規定必須2個字節都大於127才表示一個漢字;其次是GBK,其規定只要第一個字節大於127就可以了;最後是GB18030,具體編碼不清楚,好像不止2個字節,但應該是兼容GBK的,字數比前面2個要多的多。

  4. 現在,再來看ANSI,叫美國國家標準協會,顧名思義是用來定義世界編碼方式的,不像ASCII,當初創建的時候只是想給美國人自己用而已。ANSI的規則是,ASCII不能動,也就是說所有的ANSI標準都是兼容英文的,比如中文的GBK編碼就可以實現中文和英文混用。但是,每個國家自己的文字編碼就各不相同了,比如中文的ANSI編碼和日本的ANSI編碼就完全不同,所以無法實現中文和日文的混用。另外,只要你的編碼被ANSI認可,以後世界上任何地方只要使用中文,就必須用中國的這一套編碼方案。

二.Unicode

  1. 根據網上查詢的資料來看,有的說Unicode是一種符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲,並不是一種編碼方式。但是我們常用的TXT文檔中,明顯就有一種Unicode編碼格式,這是爲什麼呢?

  2. 從我目前查閱的資料來看,Unicode確實是一種符號集,可以簡寫爲UCS(Unicode Character Set)。但是,Unicode也是有他自己的編碼格式的,比如UCS-2就是用兩個字節編碼、UCS-4用4個字節編碼。那麼,TXT文檔中的Unicode是什麼呢?其實就是UCS-2,並且是小端模式。

    當然,以上都是我查閱資料所獲取的,如果不對,麻煩告知。

  3. 所以,Unicode將全世界所有的文字等都進行了統一的編碼,這樣就不會有ANSI的兼容問題。

  4. 但是Unicode一直得不到推廣。因爲英文只佔一個字節,但是在Unicode卻要佔2個字節,有很大的浪費;另外,又如何去區分Unicode和ANSII呢,計算機如何知道3個字節到底是一個字符,還是3個字符呢?

  5. 直到互聯網的出現,推動了Unicode的推廣。因爲,互聯網拉近了人和人之間的距離。那麼如果用ANSI的話,編碼格式太亂了。而UTF標準就出現了,其中UTF-8就是在互聯網上使用最廣的一種unicode的實現方式,因爲他是變長的,所以極大的節省了空間,這種爲傳輸而出現的編碼格式,使得全世界的編碼方式統一,非常的便利。

    這裏記錄下:java是雙字節編碼,採用的是UTF-16BE,中文佔2個字節,英文佔2個字節

三.URL編碼

  1. url編碼是一種瀏覽器用來打包表單輸入的格式,其基本格式爲"key=value"這種鍵值對的,如果要傳多個參數就需要用“&”符號對鍵值對進行分割。

  2. URL編碼其實使用的是ascii碼的16進制,所以,URL中只能有英文、數字還有一些特殊字符。

  3. 那我們在訪問網址的時候,有時候確實後面的參數有中文。這時候,就使用了encode編碼,將中文寫成%XX的格式,然後再通過decode還原成中文。當然,不僅僅是中文,許多字符等都是這樣操作的。具體的可以自行百度。

  4. 那麼這些中文,是使用的什麼編碼方式轉變爲%xxx的形式呢?肯定不是ASCII,因爲他壓根不認識中文。從我網上查詢的資料來看,貌似UTF-8佔多數,但好像也有GB2312這種編碼方式。

四.一個經典的問題:TXT顯示聯通亂碼

  1. 新建一個文本文檔,在裏面輸入“聯通”2個字。

    各種編碼格式介紹

  2. 然後關閉文檔,重新打開,發現變成亂碼了

    各種編碼格式介紹

  3. 這是爲什麼呢?我們再寫一個TXT文檔,寫入你好,重新打開文檔後,發現是可以正確顯示的,我們看一下他的編碼方式。通過“另存爲”,可以發現編碼方式爲ANSI

    各種編碼格式介紹

  4. 在看一下剛纔寫的聯通,發現編碼方式爲UTF-8,此時隱約可以知道,應該是編碼導致的。

    各種編碼格式介紹

  5. 這裏說一個概念:首先,計算機只認識0和1,所以任何字符等在計算機裏,都是以二進制的形式存儲的,也就是字節的形式存儲。那麼,當計算機中的字節序列是以某種編碼格式存放的,想要將這些字節序列重新變成人所認識的字符串,也需要使用這種編碼格式,否則會出現亂碼。

  6. 那麼,剛纔那個TXT文本,其實就是文本文件。文本文件在計算機中存儲的就是字節序列。如果我們直接在中文的電腦上創建一個文本文件,那麼這個文本文件只認識ANSI編碼,(這句話並不是指文本文件只認識ANSI編碼,其實你可以將各種的編碼格式的字節存放進去,但在中文機器上直接創建,就有其特殊性)。而聯通這兩個字巧了,剛好符合UTF-8的編碼格式,所以就當做UTF-8存儲了,但重新將字節轉換爲字符串的時候,是以ANSI格式轉換的,肯定是亂碼。

  7. 現在,你再試一下,在聯通的後面加入任意的字,比如聯通哈哈。那麼,哈哈2個字和UTF-8的編碼格式不一樣的,所以仍然會作爲ANSI格式存儲,就不會有問題了。

    各種編碼格式介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章