ASCII,Unicode ,UTF-8和其他

編程一開始最重要的是馬上的上手去做一個任務,那麼我們的這個任務就是你的學習的地方,遇到問題解決問題。可是計算機的知識體系已經有百年的歷史,前面的新東西還沒有完全的趕上,沒想到我的基礎也不是很牢。基礎越不牢,那麼你的遇到的問題也會越多,不過不用擔心,你慢慢的往前趕,時不時的回頭看,我想你只會越來越強。

最近上完微機原理這門課,對各種編碼搞得暈頭轉向。課都上完了,概念依舊沒有理清,最近在用Java寫通信和python寫唐詩生成器。編碼的問題出現的越來越多,我今天用了一個白天的時間把這個問題好好梳理了一遍,來這裡做分享。


一.一切的開始,ASCII

計算機是無法識別字母和符號的,他只能用數字來做處理,那麼此時ASCII碼孕育而生,所謂ASCII碼,就是將英文字母和常用符號用特定的數字去表達。

比如:

字母A用ASCII編碼是十進位的65,二進位的01000001

字元0用ASCII編碼是十進位的48,二進位的00110000,注意字元0和整數0是不同的;

(1968年的ASCII表)

我們們可以這樣理解ASCII碼,她就是一個字典,是英文世界和計算機世界溝通的通道。這個通道讓一開始的溝通變順暢。就這樣計算機和程序員愉快的交流著。

可是隨著發展問題隨之而來。中文和其他世界的也要和計算機溝通,中文和其他的語言的的進入,那ASCII肯定是不夠的。我們知道,一個字母和符號是一個位元組,而一個漢字是兩個位元組。所以在中文輸入的時候,ASCII是不能用的。一時間,編碼的世界就像是進入了戰國,群雄四起,每個地方都在制定自己編碼規則。中國制定了GB2312編碼,用來把中文編進去。日本把日文編到Shift_JIS里,韓國把韓文編到Euc-kr里。編碼的世界混亂了。


二.分久必合

計算機的實質是交流,和任何人交。所以這個分亂規則肯定是不可以的。大家一商量,把所有的字元寫在一個規則下,這樣Unicode出生了。

Unicode包含我們現在可以用到的所有字元,Unicode也就出一個存下來所有符號的字典,重新擔當起計算機世界和人類世界的翻譯工作。

到這裡我再說一句,對於理解Unicode你將它要理解為字典。我們可以隨時把他當做的翻譯的依據。但是對於Unicode我們也是編碼的。其中一開始編碼方式是UCS-2。

一般的漢字是兩個位元組,所以大多的UCS-2用兩個位元組來表示,但是某些偏僻的漢字和符號用4個位元組。

可是表示的多也會產生問題。就是我用一個英文字元的時候,我只需要用一個位元組就可以存儲,那麼用Unicode這個字典進行轉化的時候。我們知道計算機的內存在以前是很稀缺的資源,所以這種浪費資源的事我們是不會幹的。

基於以上的問題UTF-8出現了

是的,我們為了讓內存佔用更加少,我們用另一種編碼方式,基於Unicode讓英文字元和符號佔有1個位元組。此時的漢子是佔3~6個位元組。所以在英文文檔中,用UTF-8是升空間的。還有一點值得注意,就是UTF-8和ASCII的編碼在英文和一些字元的表達上是一樣的。所以帶來的好處就是,在一些使用ASCII編碼的舊的系統和設備上,用UTF-8是可以繼續使用的。

我們來舉個例子:

來自廖雪峰老師博客

有了對UTF-8的認識,那麼我們就對UTF-16(佔2個位元組)和UTF-32(佔4個位元組)這些編碼方式就理解了,一通百通。

來,我們梳理一下:

所謂的Unicode就是包含所有字元的字符集,解決了世界各地每個地方所用的編碼方式不一樣的尷尬,讓我們更好溝通。

所謂的UTF-8就是為了解決Unicode存在內存問題,將Unicode再次編碼的一種編碼方式


三.其他的知識:

如果你是一個計算機小白來學編程,雖說可以一開始就可以上手編程,但是你的總會遇到一寫及其簡單的問題,然後難倒你。

比如:遇到①nr,if(x%2),③hi,%s,you have $%d%(cad,1000)的時候,你可能是有點迷惘的,那下面沒來解決這個問題。

<一>轉義字元

先說一個很有意思的事情,我有維基百科中文和百度百科查轉義字元時,一開始我竟然沒有看懂是什麼意思。這種繞口的概念我很不喜歡,所以我想用自己方式來說明白。

所謂轉義字元:就是由+字母或數字』組成的一個符號,當計算機接受到了這個符號,它就產生相應的動作。

這個是python的轉義字元表。其實在其他語言中大同小異,幾乎沒用變化。

小小舉個例子:如果我們的i=2的時候,我們就將輸出的「我是愛計算機」換行

ifi=2{n system.out.print(我愛計算機n);n}n

<二>格式化字元

在計算機一開始的時候,假如我們要輸出一句話,裡面有變數和定量,為了將定量保持不變提高利用率。我們就將一句話變數所在的的地方,用格式化字元代替,來表示這一個變數所表示的類型。然後在輸出的時候,我們只需要將變數不足就好啦。

舉例:

yo,%s,i know you have %d house%(Anny,3)

其中%S表示字元串,也就是說,在%s所在的地方就是一個字元串。

同理,%d表示整數,所以%d所在的地方就是整數。

下面我列初格式化字元有哪些:

%s 字元串 (採用str()的顯示)

%r 字元串 (採用repr()的顯示)

%c 單個字元

%b 二進位整數

%d 十進位整數

%i 十進位整數

%o 八進位整數

%x 十六進位整數

%e 指數 (基底寫為e)

%E 指數 (基底寫為E)

%f 浮點數

%F 浮點數,與上相同

%g 指數(e)或浮點數 (根據顯示長度)

%G 指數(E)或浮點數 (根據顯示長度)

%% 字元"%"


把這些基礎寫了出來,是覺得就算是基礎有些人還是不會,所以我總結出了一起學習。基礎很重要,基礎越熟練,你走的越快。

{完}


推薦閱讀:

GB18030 根上跟 Unicode 有關係嗎?
如何評價不同平台上各種 emoji 的設計?
為什麼編碼(GBK、Big-5 等)問題這種歷史遺留始終得不到解決?
每一個Unicode里編碼的諺文(韓文)字元都曾在歷史上使用過嗎?

TAG:字符编码 | Unicode统一码 | UTF8 |