【背景】
計算機只能處理數字,文字轉換為數字才能處理
計算機中8bit作為乙個位元組,所以乙個位元組能表示最大的數字就是255
常用編碼
說明問題及其他
ascii
乙個位元組可以表示完26個字母->ascii(乙個位元組)編碼就成為美國人的標準編碼
ascii用於中文明顯不夠,中文不止255個漢字
gb2312
用兩個位元組表示乙個漢字
日文、韓文等上百種國家為了解決這個問題都發展了一套位元組的編碼,標準就越來越多,如果出現多種語言混合顯示就一定會出現亂碼
unicode
將所有語言統一到一套編碼裡
如果內容全是英文,unicode編碼比ascii需要多一倍的儲存空間,傳輸葉需要多一倍的空間
常用語python記憶體中
utf-8
把英文變長成1個位元組,漢字用3個位元組。特別生僻的變成4-6位元組
常用於檔案儲存和傳輸,進行空間壓縮
【ascii和unicode編碼】
字母a用ascii編碼十進位制是65,二進位制是 0100 0001
漢字「中」已近超出了ascii編碼的範圍,用unicode編碼是20013,二進位制是 01001110 00101101
a用unicode編碼只需要前面補0:00000000 0100 0001(浪費了很多空間)–>提出了utf-8編碼 原理
【python中的編碼】
python在記憶體中使用unicode編碼
s = "我用python"
在windows下是gb2312編碼,linux下是utf8
【windows環境】
# 英文測試 - 沒有問題
>>
> s =
"abc"
#windows下為gb2312
>>
> su = u"abc"
#unicode,在python3中已經把所有的字串都處理為unicode
>>
> s.encode(
"utf8"
)'abc'
>>
> su.encode(
"utf8"
)'abc'
# 中文測試
>>
> s =
"我用python"
#windows下為gb2312
>>
> su = u"我用python"
#unicode,在python3中已經把所有的字串都處理為unicode
>>
> s.encode(
"utf8"
)unicodedecodeerror:'utf8' codec can't decode byte 0xce
in position 0
: invalid continuation byte
# 在使用encode()函式之前必須確保s是乙個unicode的編碼
# 1. 先要將字串轉成unicode的編碼:`s.decode("gb2312")`
# 2. 然後再將s轉成utf8編碼:`s.decode("gb2312").encode("utf8")`
>>
> su.encode(
"utf-8"
)# su已經是乙個unicode就不會報錯
【linux環境】
# linux環境
>>
> s =
"我用python"
>>
>
import sys
>>
> sys.getdefaultencoding(
)#檢視預設編碼
'ascii'
>>
> s.encode(
"utf8"
)# 執行時預設為:s.decode("ascii").encode("utf8")
# 但在linux下是utf8,所以s.decode("ascii")就已經出錯
Python編碼問題
tag python,encoding,unicode 現有的字元編碼 ascii,gbk,gb2312,utf 8,unicode.unicode可以用來表示所有語言的字元,而且是定長雙位元組 也有四位元組的 編碼,包括英文本母在內。python中定義乙個unicode字串和定義乙個普通字串一樣簡...
python編碼問題
python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...
Python編碼問題
python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...