天天看點

編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式

我是來講故事的,重複,我是來講故事的ԾoԾ ,hhh

  • ASCII時代
  • ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)
  • Unicode時代
  • UTF8和UTF16的實作方式

ASCII時代

  • 話說在long long ago,計算機被人們發明了出來,這個時候大家說要讓計算機顯示文字和一些符号,可是計算機本身隻有二進制來存儲資料(我指的是馮·諾依曼架構計算機),那怎麼辦呢?
  • 于是就有了我們偉大的ASCII碼表的誕生。ASCII(American Standard Code for Information Interchange,美國資訊互換标準代碼)使用7位(bit)來表示一個字元,總共能夠表示128種字元。注意,第一位是不用的。
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式
  • BUT,因為ASCII碼看名字就知道是人家老美做出來的東西,人家才不會把其他國家的什麼文字往他們創造出來的表裡面放呢。可是雖然老美們阻止了新的文字進入ASCII碼表,可是他們阻擋不了計算機的傳播。很快計算機傳遍了歐洲,打個比方,人家法國人想把自己的那什麼奇奇怪怪的字母往電腦裡面放怎麼辦呢?
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式
  • 于是他們的眼睛就盯上了上面說到的那一位閑置不用的第一個bit。于是後來就有了IBM對原本的ASCII碼進行了擴充,使用8位來表示一個字元,新增了128種字元,這也僅僅是對一些拉丁字母和特殊符号的擴充(注意:為了不誤導大家我注明一下,IBM其實是美國的公司,不是法國)
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式

ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)

  • 好,可能有的小夥伴在上面就會繼續問了。那計算機要是到了亞洲呢?那怎麼辦??咱們中文可不止26個英文字母,光是我爸放在家裡那本《辭海》上面就有快兩萬個單字(我可沒數,百度的)這還隻是中國,還有日本,南韓……,這個八位的ASCII編碼來放我們的文字肯定不夠,八位最多就放28 = 256個單字。
  • 怎麼辦呢?于是那個時代一個國家想要普及計算機最首要要做的事情就是開發一套自己國家語言的編碼。
  • 我國在那個年代就提出一套GB2312編碼方式,這套編碼基于ASCII碼(并非IBM的ASCII擴充版本),使用2個位元組(也就是16位)表示一個漢字。具體的方式是前127個字元不變,當第一個位元組(高位元組)大于160的時候,表示一個漢字的開始,再用這個位元組組合第二個位元組(低位元組,範圍也是160-255)共同表示一個漢字。這套編碼不僅把中文編碼進去,還把一些數學符号、羅馬希臘字母和日本假名等等都編碼進去,并且還把ASCII中原有的26個英文字母和符号都編入,當然這些字母是以2個位元組表示(注意:這個時候在這個編碼裡面就有了兩套字母和一些符号),為和ASCII中原有的字母差別表示,稱前者為“全角字元”,後者為“半角字元”(哈哈哈,現在明白了嘛)。
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式
  • 當然我大中華文化底蘊深厚,我說過我爸那本詞典上就有兩萬個字,是以GB2312也隻能編入部分常用漢字,為了把更多的漢字編入進來,就創造出了GBK标準。GBK隻要求當高位元組大于127時就表示漢字的開始,低位元組也不再要求範圍。
  • 類似我國的編碼方案,其他地區和國家也制定了自己的編碼方案,如日本的Shift_JIS等等。這些編碼方案稱為 “DBCS”(Double Byte Charecter Set 雙位元組字元集)"即是用雙位元組表示一個字元,也稱為ANSI。這裡的ANSI代表了不同國家的不同編碼方案,如果一台Windows作業系統設定為中文,那麼ANSI就表示GBK,如果設定為日本ANSI就表示Shift_JIS。
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式
  • 然而問題又來了:
  • (1)假如,打個比方,像是現在唱rap的,不會幾個什麼freestyle、hold on、diss、check it out、skr(我不是針對他……)都混不下去,那麼如果要統計一段rap歌詞中有多少字元可咋辦呐?又有中文又有英文,如果這個人語言比較多加上日語什麼的就更麻煩了。
  • (2)上面那個還不算是麻煩的,統計而已,假如是資料傳輸呢?假如吳亦凡在南韓唱rap,收到大陸傳給他的一封信,一打開全是亂碼,因為你是按照南韓的編碼打開的中文文檔,當然會亂碼,這大大的影響了我吳亦凡唱rap的心情,罪孽深重!改!趕緊改進去!
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式

Unicode時代

  • 為了世界的和平,為了愛和正義,武藏小次郎,哦,不,是ISO(國際标準化組織)制定了一種新的編碼規範,将全世界的文字放在一張表内,稱它為"Universal Multiple-Octet Coded Character Set",簡稱 UCS, 俗稱"UNICODE"。嚴格說Unicode隻是一套标準,為全世界文字給予一個唯一的編碼,但是并沒有規定在計算機中如果存儲。
    編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式
  • 根據Unicode标準來制定具體的實施方案就是UTF-8,UTF16以及UTF32,它們用來規定了如何在計算機中存儲、表示。
  • UTF-16,對于Unicode标準中的文字,使用2個位元組(16位)或4個位元組來存儲其編号。為什麼是2個或4個位元組表示呢?因為如果要包含全世界所有的符号文字,即使使用2個位元組都無法包含,想想GBK編碼,占滿了2個位元組僅僅包含我們大中華文字部分文字。但是針對各國的常用文字在2個位元組内都能包含,是以通常使用2個位元組的UTF16就足夠了。是以在使用UTF16編碼的文章或文檔裡,統計字元個數無需像ANSI那樣麻煩,而且同一篇文章在各國的Windows等作業系統中使用UTF8打開不會造成亂碼問題,十分友善。
  • UTF8,對于歐美的一些國家,常用的還是英文字母,如果使用UTF16,白白浪費一倍的存儲空間(因為他們隻需前128的字元就足夠了)。針對此,UTF8産生了,它是一種變長編碼方式,使用8位來實作Unicode中的所有字元

UTF8和UTF16的實作方式

哈哈哈,我都說了這篇文章是講故事來的,我才不跟你講具體實作呢,有時間再補上。嗯,就到這裡啦~

編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式

嘿嘿,I am very glateful that 你看到這裡了哦~下回再見ヾ(o◕∀◕)ノヾ

Thx

編碼問題的故事(ANSI、ASCII、Unicode,UTF8和UTF16)ASCII時代ANSI時代(順帶給講一下什麼是半角字元,什麼是全角字元,細心地小夥伴們應該在輸入法中看過這個東西吧)Unicode時代UTF8和UTF16的實作方式

繼續閱讀