計算機 底層都是二級制01組成的機器語言,我們屏幕上顯示的字符等在計算機底層中也只是一串01代碼而已,那么計算機怎么識別不同的字符呢,這就需要一個映射規(guī)則鬓梅,哪個字符對應(yīng)哪個01串。
ascii是由美國牛逼的XXX制定的規(guī)則镜遣,只制定了128個字母數(shù)字和符號的編碼己肮,一個字節(jié)。
但是這是美國的悲关,為了顯示漢字谎僻,我們國家制定了GBXXX標準,但是有那么多國家寓辱,這個國家用一個標準艘绍,那個國家用一個標準,就會產(chǎn)生混亂秫筏。
最后大家共同用Unicode诱鞠,Unicode通常是兩個字節(jié),之前ascii編碼的數(shù)字字母現(xiàn)在在Unicode中變成了兩個字節(jié)这敬,這樣在大多是英文的傳輸中就會造成存儲和傳輸浪費航夺。
所以出現(xiàn)了可變長編碼UTF-8,UTF-8編碼把一個Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié)崔涂,常用的英文字母被編碼成1個字節(jié)阳掐,漢字通常是3個字節(jié),只有很生僻的字符才會被編碼成4-6個字節(jié)冷蚂。如果你要傳輸?shù)奈谋景罅坑⑽淖址员#肬TF-8編碼就能節(jié)省空間
UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分蝙茶,所以艺骂,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作,因為英文字母在ascii中是一個字節(jié)隆夯,在utf-8中也是一個字節(jié)钳恕,而ascii不支持中文。
從上到下分別為GBK,unicode和utf編碼蹄衷,其中需要注意的是無法從GBK直接轉(zhuǎn)化為utf-8忧额,可以吧Unicode字符串encode("utf-8")到UTF8,可以把Utf-8字符串decode("utf-8")到Unicode字符串
注意
encode主要是把unicode encode到utf-8宦芦,decode主要是從utf-8到unicode,windows內(nèi)核都是unicode
python在print時轴脐,會自動把字符串encode為sys.stdout.encoding调卑,當(dāng)python把一個已經(jīng)encode的字符串再進行encode會報錯