一、ASCII編碼和Unicode編碼的區別:ASCII編碼是1個字節,而Unicode編碼一般是2個字節;python
二、若是統一成Unicode編碼,亂碼問題今後消失了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,在存儲和傳輸上就十分不划算。因此,本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8
編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。web
三、在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼。瀏覽器
用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件:ruby
瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:服務器
四、最新的Python 3版本中,字符串是以Unicode編碼的,也就是說,Python的字符串支持多語言;網絡
對於單個字符的編碼,Python提供了ord()
函數獲取字符的整數表示,chr()
函數把編碼轉換爲對應的字符;編輯器
因爲Python的字符串類型是str
,在內存中以Unicode表示,一個字符對應若干個字節。若是要在網絡上傳輸,或者保存到磁盤上,就須要把str
變爲以字節爲單位的bytes
。函數
Python對bytes
類型的數據用帶b
前綴的單引號或雙引號表示,要注意區分'ABC'
和b'ABC'
,前者是str
,後者雖然內容顯示得和前者同樣,但bytes
的每一個字符都只佔用一個字節。編碼
以Unicode表示的str
經過encode()
方法能夠編碼爲指定的bytes
,例如:spa
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
五、反過來,若是咱們從網絡或磁盤上讀取了字節流,那麼讀到的數據就是bytes
。要把bytes
變爲str
,就須要用decode()
方法:
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'
六、因爲Python源代碼也是一個文本文件,因此,當你的源代碼中包含中文的時候,在保存源代碼時,就須要務必指定保存爲UTF-8編碼。當Python解釋器讀取源代碼時,爲了讓它按UTF-8編碼讀取,咱們一般在文件開頭寫上這兩行:
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
第一行註釋是爲了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;
第二行註釋是爲了告訴Python解釋器,按照UTF-8編碼讀取源代碼,不然,你在源代碼中寫的中文輸出可能會有亂碼。
申明瞭UTF-8編碼並不意味着你的.py
文件就是UTF-8編碼的,必須而且要確保文本編輯器正在使用UTF-8 without BOM編碼