中文編碼—轉載自柴知道
時間:2023-06-21 22:03:02 | 來源:網(wǎng)站運營
時間:2023-06-21 22:03:02 來源:網(wǎng)站運營
中文編碼—轉載自柴知道:
聲明:本文轉載自柴知道,為個人學習資料記錄,原視頻見視頻,原文見文本。
內容筆記:
使用一個字節(jié)前128字符空間:ascii
一個字節(jié)后全128空間:eascii
兩個字節(jié):GB2312—80
微軟擴展中文集:GBK2312
萬國碼:unicode(utf8,utf16,utf32)
文字版腳本2022年,一則娛樂新聞沖上了熱搜,但網(wǎng)友們很快發(fā)現(xiàn),這里的“?”并不是我們常用的中文“入”,而是熱心人為了降熱度用的替換符號,給我們玩了一個花招。
這只是有關電腦文字的無數(shù)小故事之一。在過去的日子里,你見過跟別的字格格不入的孤寡文字,打開過全是“錕 (kūn) 斤拷”的txt小說,全是框框的游戲對話,點擊過長得跟真網(wǎng)址一模一樣的釣魚網(wǎng)站,甚至有一個連派出所也登記不了的名字......
所有這一切,都跟電腦顯示文字的原理有關。在這期視頻里,我們會帶你入門中文顯示,了解亂碼、孤寡文字和釣魚網(wǎng)站背后的有趣故事。
話不多說,開始吧!
電腦顯示文字,涉及到三個重要的概念:字符、字符集,和字符編碼。
一個漢字、一個拉丁字母、一個數(shù)字,世界上各種語言里的“字”和“標點符號”,都屬于
“字符”。一堆字符組成的集合,叫做
“字符集”。
人類世界有海量的字符,它們原本都寫在紙上,甚至刻在石頭上。而所有這些字符,計算機......一個都不認識。
你肯定知道,計算機只認二進制,只能以比特的形式記錄“0”和“1”。為了讓計算機“識字”,我們就需要把這些字符用 0 和 1 表示出來。把字符轉換成 0 和 1 的規(guī)則,叫做
“字符編碼”。
那么,怎么給字符編碼,把它們變成0和1呢?
很簡單:我們可以選定一個字符集,讓字符們“排排坐”,再把“座位序號”轉換成二進制——這個“座位序號”叫做
“碼位”,座位的總數(shù)叫做
“碼空間”。碼空間越大,字符集就越大。
比如世界上如果只有“柴”“知”“道”這三個字的話,那我們就可以把“柴”編碼為00,“知”編碼為01,“道”編碼為10。這樣計算機一看到這些編碼,就知道要顯示哪個字了。
在現(xiàn)實世界中,計算機存儲數(shù)據(jù)的基本單位是“字節(jié)”,也就是Byte。一個字節(jié),由 8 個二進制位組成,也就是 8 個比特(bit)。每個比特有 0 和 1 兩種狀態(tài),8個比特一共有 2^8 個,也就是 256 種不同的狀態(tài)。
所以如果只用一個字節(jié)長度來編碼字符,那么這個字符集就能容納 256 個字符。
聽起來很少對不對?但對于英文來說已經(jīng)夠了,反正他們一共只有 26 個英文字母嘛~
所以在上世紀 60 年代,美國人先搞出了“美國信息交換標準代碼”,簡稱 ASCII 。ASCII 總共收錄了 128 個字符,包括大小寫拉丁字母、數(shù)字、常用標點,以及像 ESC、換行這種看不見的控制字符。
到此為止,事情都很簡單:無非就是給這 128 個字符按照順序排號,再把序號轉換為二進制數(shù)字。需要顯示的時候,從計算機存儲的 ASCII 字符集中按編號調用字符,就能在屏幕上顯示出來。
一個字符集,對應一個編碼規(guī)則,不會出錯,一切都很清晰,簡單,完美。
但所有的完美都是易碎的。這世界上遠遠不止英文一種語言,當各國都要跑步進入信息化社會的時候,文字顯示的“亂紀元”就開啟了。
剛才說過,用一個字節(jié)編碼字符,最多能容納256個碼位。英語一共才那么點字符,256 個碼位用完都還剩一半。所以西歐一些國家,就搞了“擴展美國信息交換標準代碼”,EASCII,也就是用剩下的這 128 個空位,來表示其他的字符:比如上方有注音符號的法語字母,西班牙語里的特殊標點,數(shù)學上常用的 α、β 等希臘字母,以及一大堆特殊符號等等。
這時候,問題就已經(jīng)開始冒頭了:
各國搞的 EASCII 字符集和編碼,后面 128 個字符都不太一樣,一共搞出了 200 多種 EASCII ,互不兼容。就算是同樣一串二進制數(shù),在不同的 EASCII 中對應的字符也不同。所以同一份文本哪怕放到不同語言的計算機中打開,都可能會出現(xiàn)“亂碼”。
這還算好的。因為當信息高速公路修到中、日、韓等國家和地區(qū)時,就要面臨一個更復雜的問題:漢字。
漢字的歷史源遠流長,總數(shù)量那可太多了。我國 1980 年公布的《GB 2312-80 信息交換用漢字編碼字符集 基本集》,就包含了 6763 個常用簡體漢字,以及一些標點、符號、數(shù)字、拉丁字母等。
那很顯然, 1 個字節(jié)長度最多只能編碼 256 個字符,對漢字來說根本不夠用。所以 GB 2312 用兩個字節(jié)長度,來編碼一個字符,這樣理論上就可以容納 2^16 個,也就是 65536 個字符?,F(xiàn)在輸入法里的全角標點符號就是用兩個字節(jié)編碼的,而半角標點符號,就是用一個字節(jié)編碼的。
不過,GB 2312-80 字符集里這六千多個漢字,只是最最常用的漢字,其實根本不夠用,比如像“喆”,“頫(fǔ)”,“旻(mín)”,“祎(yī)”這些人名中的常見字甚至都不包括在內。
那字符集里沒有的那個字怎么辦呢?那就打不出來。
所以在過去,如果你叫“張