1. 程式人生 > >python基礎一 ------Python 的編碼

python基礎一 ------Python 的編碼

網絡 歷史 用兩個 解決辦法 等價 編碼 default abc odin

首先了解一下歷史,但是本篇文章冗雜,如老太太裹腳布----------又臭又長

編碼歷史:

1. 計算機只能處理數字,文本文件只有轉換為數字
才能處理。8bit==1字節 所以一個字節能表示的最大的數就是255

2. 美國人發明計算機。用英語,所有一個字節就表示了所有字符
就是ASCII(一個字節) 編碼就是美國人的標準編碼

3. 當中國人使用計算機時,需要表示中文字符,於是就發明了
GB2312的編碼格式,即用兩個字節表示一個漢字。同理,其他語言國家
也就創建了自己相應的編碼。沒有一個共同的標準,於是當不同語言用
了不對應的編碼就會產生亂碼

4.為統一標準,Unicode 編碼出現了,所有語言統一到一套編碼
Unicode與ASCII 編碼比較
1) 字母A: ASCII 十進制65,二進制就是 0100 0001
漢字中 ASCII表示不了 采用Unicode編碼為20013 二進制:01001110 00101101
2) 為計算機識別統一長度,所以A 前面位置補0 即 00000000 0100 0001
標準就此統一
5. 標準統一了,亂碼問題解決了,但是Unicode編碼長度較長,但計算機英文為主,
若內容若全是英文,Unicode編碼就比ASCII編碼多一倍存儲空間,同時傳輸也多一倍
怎麽解決呢?

6.要是Unicode 編碼可以變化就好了,於是UTF-8 出現了
utf-8 中,字母一個字節,一個漢字3個字節,特別生僻的4-6個
於是節約了空間和存儲

7,那麽問題來了:計算機只認Unicode 編碼
utf-8 之間怎樣轉換的
如圖:

技術分享





當需要被計算機識別時,就會加載到內存,此時采用的編碼就必須是Unicode 編碼
當需要在網絡中傳輸時,或者存儲在文件中時,就采用UTF-8編碼,為了節約空間成本
所以就有了相互轉化

python2 和python3 在Windows/Linux 上的編碼轉換

python2:

  在Windows:

    1. 先來看看window 本身是什麽編碼
import sys
sys.getdefaultencoding()
#out: "utf-8"
2. 字符串全部英文
s1= "abc" --> type(s1):str
s2 = u"abc" --> type(s2):Unicode
u""的意義:表示將後面的字符串以unicode格式存儲
s1.encode("utf8") 成功
s2.encode("utf8") 成功

3. 當出現中文時:
s1 = "你好" --> GB2312編碼。windows下
s2 = u"你好"
s1.encode("utf8") 報錯
s2.encode("utf8") 成功

報錯原因:
在內存中是以Unicode 進行編碼的,但是
s1 在傳遞過來時就是不是Unicode編碼了(原因是存儲浪費),而
encode是將一個Unicode 對象轉化為參數中的編碼格式進行編碼
所以說 s2不會報錯

解決辦法:
先將這個gb2312的編碼轉化為unicode編碼的對象
然後再轉化為utf-8
s1.decode("gb2312").ecode("utf8") 成功 Windows下為"gb2312"
decode("xx")方法是將一個編碼為"xx"的對象轉化
為Unicode對象

  在Linux下:

    1. 先來看看linux 本身是什麽編碼
import sys
sys.getdefaultencoding()
#out: "ascii"
2. 字符串全部英文
s1= "abc" --> type(s1):str
s2 = u"abc" --> type(s2):Unicode
u""的意義:表示將後面的字符串以unicode格式存儲
s1.encode("utf8") 成功
s2.encode("utf8") 成功
3. 當出現中文時:
s1 = "你好" --> utf-8編碼。Linux下 為啥不是ascii? 那ascii能表示中文嗎?
肯定是轉化為了utf-8 了啊
s2 = u"你好"
s1.encode("utf8") 報錯
s2.encode("utf8") 成功
解決辦法:
先將這個utf-8的編碼轉化為unicode編碼的對象
然後再轉化為utf-8
s1.decode("utf8").ecode("utf8") 成功 Linux下中文為"utf-8"
等價於 s1 又轉回去了,本身就是utf-8編碼

python 3:

  在python3 中,所有的str類型的都是Unicode 格式編碼,可以直接encode為"utf-8"

在Windows:
1. 字符串全部英文
s1= "abc" --> type(s1):str
s2 = u"abc" --> type(s2):Unicode
u""的意義:表示將後面的字符串以unicode格式存儲
s1.encode("utf8") 成功
s2.encode("utf8") 成功
2. 當出現中文時:
s1 = "你好" --> Unicode編碼。windows下
s2 = u"你好" ---> 沒有必要這樣寫 ,不加u"",3也認為這就是Unicode
s1.encode("utf8") 成功
s2.encode("utf8") 成功
在Linux下: 跟在window 下一樣

總結:

談談 #-*-coding:UTF-8 -*-

  python2與3 最大的區別:
2 中當文件有中文出現時就必須在開頭加上,而且漢字字符串必須加u""
作用:
告知python 這個文件是按照utf-8格式編碼的python就會按照這個編碼進行解讀,
然後在內部進行Unicode轉換
為什麽3中不用寫:
3中Python都會將文件以Unicode進行解讀
3
技術分享

技術分享



python基礎一 ------Python 的編碼