Python 編碼問題

2021-09-09 07:25:47 字數 2109 閱讀 6518

【背景】

計算機只能處理數字,文字轉換為數字才能處理

計算機中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...