淺談編碼——編碼是什麼? 爲什麼會出現亂碼?

大家可能在計算機上看到過類似ASCII, GBK, GB2013,Unicode等等這些東西,但是卻搞不清楚它們的關係,沒辦法正確地使用。再次,特對編碼進行簡要說明,讓大家可以更好地理解和運用。

1. 編碼產生的原因

在計算機中,所有的數據在存儲和運算時,都要使用二進制數(也就是0和1兩個數)表示。但是,具體使用哪些二進制數代表哪個具體的符號,每個地區都有自己約定的一套規則,這就是編碼。

 

2.常見編碼類型

a. ASCII

ASCII (American Standard Code for Information Interchange),美國信息交換標準代碼是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,它是最通用的信息交換標準ASCII。第一次以規範標準的類型發表是在1967年,最後一次更新則是在1986年,到目前爲止共定義了128個字符。

由此我們可以看出ASCII是美國人自己搞的一套編碼,它可以適用於英語的書寫,英語的26個大小寫字母以及一些常用的符號都包含在內。

但是,對於其它國家自己的語言來說,這就不適用了。以中文爲例,常用的漢字就有5000多個,這個怎麼用ASCII碼去表示呢?這個是無法表示的。

所以,我們國家研發了自己的一套編碼規則,也就是GB 2312-1980和GBK兩套編碼。

 

b. GB 2312-1980

GB是啥意思? 2312是什麼意思? 1980又是什麼意思呢?

GB就是漢語拼音國標的首字母,也就是國家標準的意思;

2312是套標準的一個編號,就類似你家的郵政編號一樣,只是一個編號而已;

那1980呢? 這個很顯然就是年份嘛,就是說這個是在1980年發佈的。

那麼它完整的意思應該就是:在1980年發佈的一套編號爲2312的國家標準編碼規則。

哈哈,是不是一下就清楚了!?

下面是詳解: 

《信息交換用漢字編碼字符集》是由中國國家標準總局1980年發佈,1981年5月1日開始實施的一套國家標準,標準號是GB 2312—1980。

GB2312編碼適用於漢字處理、漢字通信等系統之間的信息交換,通行於中國大陸;新加坡等地也採用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB 2312。

基本集共收入漢字6763個和非漢字圖形字符682個。整個字符集分成94個區,每區有94個位。每個區位上只有一個字符,因此可用所在的區和位來對漢字進行編碼,稱爲區位碼

把換算成十六進制的區位碼加上2020H,就得到國標碼。國標碼加上8080H,就得到常用的計算機機內碼。1995年又頒佈了《漢字編碼擴展規範》(GBK)。GBK與GB 2312—1980國家標準所對應的內碼標準兼容,同時在字彙一級支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢字,共計20902字。

 

c. GBK 

有了GB 2312,中國的計算機事業得以發展壯大。但是發展發展着,發現,誒, GB 2312的的編碼不夠用了,我們有更多的內容需要傳入到計算機裏面,怎麼辦?那就擴展一下嘛,所以就有了GBK 這種編碼(我悄悄地告訴你,這個K不就是擴的漢語拼音嘛?)

下面是詳解:

1995年,國家頒佈了《漢字編碼擴展規範》(GBK)。GBK與GB 2312—1980國家標準所對應的內碼標準兼容,同時在字彙一級支持ISO/IEC10646—1和GB 13000—1的全部中、日、韓(CJK)漢字,共計20902字。簡單來說,不就是可以儲存的東西變多了嘛!

 

d. Unicode

上面講了一下中國的編碼方式。但是如果這樣看的話,那是不是每個地區都得自己弄一套編碼規則啊?世界上有那麼多國家,那麼多語言,這個怎麼辦呢?

爲了解決這一問題,我們的萬國碼誕生了。

Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公佈。

這樣一來,是不是不同地區的編碼就統一了呢? 大家用不同語言寫的東西,都可以適用於這一套規則,這多方便啊!

 

e. UTF-8

Unicode碼,這裏是UTF-8,是不是長得很像啊?都是U開頭的。沒錯,你猜對了,UTF-8又是Unicode的升級版本。爲什麼會有這個版本呢?

這是因爲,對於原本的ASCII碼,我們至於要佔一個位(使用一個字節的內存)就可以儲存信息了,但是Unicode碼包含了更多的語言文字,就需要更長的編碼去表示一個文字/字符,那麼對於原本只需要用ASCII就能解決的問題,用Unicode碼去編寫,這樣就造成了一種極大的浪費,大大佔用了計算機的儲存空間。所以,UTF-8就是爲了解決這個問題而誕生的。

詳解:

UTF-8(Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字符編碼。它可以用來表示Unicode標準中的任何字符,而且其編碼中的第一個字節仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進行少部份修改後,便可繼續使用。因此,它逐漸成爲電子郵件、網頁及其他存儲或傳送文字的應用中,優先採用的編碼。

這裏的8表示8位元,就是說,一個字符最多可以佔8個位置。但是如果只要要一個位置就能表達,就別扯淡去佔用空間了,能用一位表示就用一位;不行就兩位,再不行就三位........一直到8位。


爲啥會亂碼???

知道了編碼規則,就很好解釋爲什麼會出現亂碼現象了。

如果你在大街上看到一個法語單詞,你以爲這是英語單詞,你就去抱着英漢詞典去查,這樣能查到嗎?

有些人要反駁了!

的確有可能查到啊。 比如英文的style和法語的style一模一樣,只是發音不同。 

這就對了嘛!!! 所以,有的時候,出現錯誤了編碼,我們還是能看懂一些東西,或者說有那麼一部分它的編碼還是相通的。

那要怎麼去解決亂碼的問題呢? 最簡單有效的方法就是在代碼的後面加上一個encoding = '編碼',比如,encoding = 'utf-8'就可以了。 

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