【學習筆記】計算機編碼

0.概述

有一天,我突發奇想,想要在一段文本中篩選出所有的中文。

這一下把我難倒了——老師教的是 ASCIIASCII 碼,包含了所有的拉丁字母、數字等。但是漢字是怎麼存儲的?

我懵了,趕緊上網一陣亂查,把自己都查暈了,寫個文章捋一捋。所以這是一篇沒用的垃圾文章

1.ASCIIASCII

ASCIIASCII 碼在百度百科中被解釋爲“美國信息交換標準代碼”,是一種編碼的方式,也是最簡單的一種編碼。它的範圍很小,只用了 [0,128)[0,128) 這些數字。

說明:下文將涉及一些 C++\text{C++} 內的玩意兒。不知道是不是所有編程語言的存儲方式都相同?

如果你試着將 charcharintint 亂轉換,你就會得到一張 ASCIIASCII 碼錶。這在百度百科中有。

衆所周知,charchar 是一個字節,可以存儲 [128,128)[-128,128) 內的整數。

2.UTF8UTF-8

只有拉丁字母怎麼夠?世界上那麼多的語言,只靠 ASCIIASCII 碼錶示不了啊。

然後就有了更強力的編碼方案,unicodeunicode 。顯然來源於 uniqueunique 的意義。它 可以容納世界上所有文字和符號!可以參見百度百科

介紹一個小技巧:在 wordword 中按 Alt+XAlt+X ,可以使光標前的字符轉化成 unicodeunicode 碼(十六進制)!再按一次,還能轉換回來。提示:unicodeunicode 是四位十六進制數,共兩字節。

然而,很顯然,這玩意兒很長。全世界的字符那麼多,如果每一個都按照 unicodeunicode 規定的碼值來存儲,就會很浪費空間。用二進制一看:一大堆零!

所以 unicodeunicode 只規定了一個對應法則,但是 存儲時使用特定方案。其中一種,就是 UTF8UTF-8

它是 變長 的,使用一到六個字節。究竟怎麼存?請看這篇文章

3.ANSIANSI

ANSIANSI 是啥呀?其實就是 本地語言。所以它並不固定,在中國(簡體中文),ANSIANSI 代指 GBKGBKGB2312GB\bf{2312}

但是,任何一個國家的 ANSIANSI 都會使用兩個字節來存儲,除了純英文使用 ASCIIASCII 碼。

可以看這篇文章來加深印象。至於 GBKGBK 麼?我馬上要講的啦!

4.GB2312GB\bf{2312}

這是什麼?是中文的編碼方案(終於進入正題了)。它使用兩個字節來存儲一個漢字。而且,很有特點的是,這兩個字節範圍爲 [0x80,0xFF)[\text{0x80,0xFF}) 。爲什麼不使用 0xFF\text{0xFF} 這個編碼呢?有待考究。

這個範圍,使用 charchar 存儲時,將會得到負數。所以,負數就是判斷中文的方法!

5.GBKGBK

然而 GB2312GB\bf{2312} 沒有收錄所有漢字,所以又搞了個 GBKGBKANSIANSIwin95win95 以後就代表着這種編碼方式。

更多的我就不講了,同學們自己看看這篇文章也是極好的。

反正我還沒碰到過需要使用 GB18030GB\bf 18030 相較於 GBKGBK 擴展的字符。

6.控制檯語言

有時候程序輸出到控制檯(黑窗口,cmdcmd ) 的中文會變成亂碼,但是改用文件輸入輸出,直接打開文件,結果又是正確的。爲什麼?

因爲控制檯的默認語言是 ANSIANSI 。這可以通過右鍵單擊打開的 cmdcmd 窗口的邊欄,選擇屬性,進行查看。

程序內的漢字常量(雙引號內的漢字)的編碼方式取決於 cppcpp 文件本身。txttxt 文件默認 ANSIANSI

7.總結

  • ASCIIASCII 是個超級小的字符編碼,但是常用的符號,如空格、換行等,皆包含其內。並且,這是國際標準,所以其餘的編碼方案几乎都沒有改動已有的 ASCIIASCII 對應方案。
  • UTF8UTF-8 是存儲全世界通用編碼 unicodeunicode 的方案。存儲 ASCIIASCII 碼包含的字符,只需要一個字節;存儲漢字,需要三個字節。所以,UTF8UTF-8 可以存儲中文。
  • GB2312,GBK,GB18030GB{\bf 2312},GBK,GB\bf 18030 都是漢字編碼方式。與 UTF8UTF-8 是獨立的。雙字節,專門管中文,遇到日文就有點捉急了。
  • 判斷中文的方法:對於 GBKGBK ,使用 c<0c<0 即可;對於 UTF8UTF-8 怎麼辦?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章