精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python編碼為什么那么蛋疼?

開發(fā) 后端
據(jù)說,每個做 Python 開發(fā)的都被字符編碼的問題搞暈過,最常見的錯誤就是 UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解決,遺憾的是,錯誤又出現(xiàn)在其它地方,問題總是重蹈覆轍,str 到 unicode 之間的轉(zhuǎn)換用 decode 還是 encode 方法還特不好記,老是混淆,問題究竟出在哪里?

據(jù)說,每個做 Python 開發(fā)的都被字符編碼的問題搞暈過,最常見的錯誤就是 UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解決,遺憾的是,錯誤又出現(xiàn)在其它地方,問題總是重蹈覆轍,str 到 unicode 之間的轉(zhuǎn)換用 decode 還是 encode 方法還特不好記,老是混淆,問題究竟出在哪里?

為了弄清楚這個問題,我決定從 python 字符串的構成以及字符編碼的細節(jié)上進行深入淺出的分析

字節(jié)與字符

計算機存儲的一切數(shù)據(jù),文本字符、圖片、視頻、音頻、軟件都是由一串01的字節(jié)序列構成的,一個字節(jié)等于8個比特位。

而字符就是一個符號,比如一個漢字、一個英文字母、一個數(shù)字、一個標點都可以稱為一個字符。

字節(jié)方便存儲和網(wǎng)絡傳輸,而字符用于顯示,方便閱讀。例如字符 “p” 存儲到硬盤是一串二進制數(shù)據(jù) 01110000,占用一個字節(jié)的長度

編碼與解碼

我們用編輯器打開的文本,看到的一個個字符,最終保存在磁盤的時候都是以二進制字節(jié)序列形式存起來的。那么從字符到字節(jié)的轉(zhuǎn)換過程就叫做編碼(encode),反過來叫做解碼(decode),兩者是一個可逆的過程。編碼是為了存儲傳輸,解碼是為了方便顯示閱讀。

例如字符 “p” 經(jīng)過編碼處理保存到硬盤是一串二進制字節(jié)序列 01110000 ,占用一個字節(jié)的長度。字符 “禪” 有可能是以 “11100111 10100110 10000101″ 占用3個字節(jié)的長度存儲,為什么說是有可能呢?這個放到后面再說。

Python 的編碼為什么那么蛋疼?當然,這不能怪開發(fā)者。

這是因為 Python2 使用 ASCII 字符編碼作為默認編碼方式,而 ASCII 不能處理中文,那么為什么不用 UTf-8 呢?因為 Guido 老爹為 Python 編寫第一行代碼是在1989年的冬天,1991年2月正式開源發(fā)布了第一個版本,而 Unicode 是1991年10月發(fā)布的,也就是說 Python 這門語言創(chuàng)立的時候 UTF-8 還沒誕生,這是其一。

Python 把字符串的類型還搞成兩種,unicode 和 str ,以至于把開發(fā)者都弄糊涂了,這是其二。python3 徹底把 字符串重新改造了,只保留一種類型,這是后話,以后再說。

str與unicode

Python2 把字符串分為 unicode 和 str 兩種類型。本質(zhì)上 str 是一串二進制字節(jié)序列,下面的示例代碼可以看出 str 類型的 “禪” 打印出來是十六進制的 \xec\xf8 ,對應的二進制字節(jié)序列就是 ’11101100 11111000′。

>>> s = '禪'
>>> s
'\xec\xf8'
>>> type(s)
<type 'str'>

而 unicode 類型的 u”禪” 對應的 unicode 符號是 u’\u7985′

>>> u = u"禪"
>>> u
u'\u7985'
>>> type(u)
<type 'unicode'>

我們要把 unicode 符號保存到文件或者傳輸?shù)骄W(wǎng)絡就需要經(jīng)過編碼處理轉(zhuǎn)換成 str 類型,于是 python 提供了 encode 方法,從 unicode 轉(zhuǎn)換到 str,反之亦然。

encode

>>> u = u"禪"
>>> u
u'\u7985'
>>> u.encode("utf-8")
'\xe7\xa6\x85'

decode

>>> s = "禪"
>>> s.decode("utf-8")
u'\u7985'
>>>

不少初學者怎么也記不住 str 與 unicode 之間的轉(zhuǎn)換用 encode 還是 decode,如果你記住了 str 本質(zhì)上其實是一串二進制數(shù)據(jù),而 unicode 是字符(符號),編碼(encode)就是把字符(符號)轉(zhuǎn)換為 二進制數(shù)據(jù)的過程,因此 unicode 到 str 的轉(zhuǎn)換要用 encode 方法,反過來就是用 decode 方法。

encoding always takes a Unicode string and returns a bytes sequence, and decoding always takes a bytes sequence and returns a Unicode string”.

清楚了 str 與 unicode 之間的轉(zhuǎn)換關系之后,我們來看看什么時候會出現(xiàn) UnicodeEncodeError、UnicodeDecodeError 錯誤。

UnicodeEncodeError

UnicodeEncodeError 發(fā)生在 unicode 字符串轉(zhuǎn)換成 str 字節(jié)序列的時候,來看一個例子,把一串 unicode 字符串保存到文件

# -*- coding:utf-8 -*-
def main():
    name = u'Python之禪'
    f = open("output.txt", "w")
    f.write(name)

錯誤日志

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 6-7: ordinal not in range(128)

為什么會出現(xiàn) UnicodeEncodeError?

因為調(diào)用 write 方法時,Python 會先判斷字符串是什么類型,如果是 str,就直接寫入文件,不需要編碼,因為 str 類型的字符串本身就是一串二進制的字節(jié)序列了。

如果字符串是 unicode 類型,那么它會先調(diào)用 encode 方法把 unicode 字符串轉(zhuǎn)換成二進制形式的 str 類型,才保存到文件,而 encode 方法會使用 python 默認的 ascii 碼來編碼

相當于:

>>> u"Python之禪".encode("ascii")

但是,我們知道 ASCII 字符集中只包含了128個拉丁字母,不包括中文字符,因此 出現(xiàn)了 ‘ascii’ codec can’t encode characters 的錯誤。要正確地使用 encode ,就必須指定一個包含了中文字符的字符集,比如:UTF-8、GBK。

>>> u"Python之禪".encode("utf-8")
'Python\xe4\xb9\x8b\xe7\xa6\x85'

>>> u"Python之禪".encode("gbk")
'Python\xd6\xae\xec\xf8'

所以要把 unicode 字符串正確地寫入文件,就應該預先把字符串進行 UTF-8 或 GBK 編碼轉(zhuǎn)換。

def main():
    name = u'Python之禪'
    name = name.encode('utf-8')
    with open("output.txt", "w") as f:
        f.write(name)

當然,把 unicode 字符串正確地寫入文件不止一種方式,但原理是一樣的,這里不再介紹,把字符串寫入數(shù)據(jù)庫,傳輸?shù)骄W(wǎng)絡都是同樣的原理

UnicodeDecodeError

UnicodeDecodeError 發(fā)生在 str 類型的字節(jié)序列解碼成 unicode 類型的字符串時

>>> a = u"禪"
>>> a
u'\u7985'
>>> b = a.encode("utf-8")
>>> b
'\xe7\xa6\x85'
>>> b.decode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 2: incomplete multibyte sequence

把一個經(jīng)過 UTF-8 編碼后生成的字節(jié)序列 ‘\xe7\xa6\x85′ 再用 GBK 解碼轉(zhuǎn)換成 unicode 字符串時,出現(xiàn) UnicodeDecodeError,因為 (對于中文字符)GBK 編碼只占用兩個字節(jié),而 UTF-8 占用3個字節(jié),用 GBK 轉(zhuǎn)換時,還多出一個字節(jié),因此它沒法解析。避免 UnicodeDecodeError 的關鍵是保持 編碼和解碼時用的編碼類型一致。

這也回答了文章開頭說的字符 “禪”,保存到文件中有可能占3個字節(jié),有可能占2個字節(jié),具體處決于 encode 的時候指定的編碼格式是什么。

再舉一個 UnicodeDecodeError 的例子

>>> x = u"Python"
>>> y = "之禪"
>>> x + y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) >>>

str 與 unicode 字符串 執(zhí)行 + 操作是,Python 會把 str 類型的字節(jié)序列隱式地轉(zhuǎn)換成(解碼)成 和 x 一樣的 unicode 類型,但Python是使用默認的 ascii 編碼來轉(zhuǎn)換的,而 ASCII 中不包含中文,所以報錯了。

>>> y.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

正確地方式應該是顯示地把 y 用 UTF-8 或者 GBK 進行解碼。

>>> x = u"Python"
>>> y = "之禪"
>>> y = y.decode("utf-8")
>>> x + y
u'Python\u4e4b\u7985'

以上內(nèi)容都是基于 Python2 來講的,關于 Python3 的字符和編碼將會另開一篇文章來寫,保持關注。

責任編輯:張燕妮 來源: liuzhijun
相關推薦

2023-06-08 18:25:40

Doris場景查詢

2021-06-09 09:32:58

Esbuild 工具前端

2020-08-03 07:50:56

存儲對象存儲

2020-10-12 07:30:31

Chrome下載

2020-04-24 08:15:51

代碼 if else數(shù)組

2015-06-05 14:15:13

程序員難升職

2022-02-21 10:06:14

自動駕駛汽車智能

2025-05-27 02:20:00

PG數(shù)據(jù)庫DBA

2017-01-21 14:57:43

Linuxsystemd

2023-11-20 17:38:07

Djangoagtailadmin

2025-08-01 02:11:00

2013-07-04 14:05:26

功能用戶體驗

2023-11-07 15:11:46

Kafka技巧

2025-08-05 07:58:28

2020-01-22 16:36:52

MYSQL開源數(shù)據(jù)庫

2023-10-15 12:23:10

單線程Redis

2022-08-17 14:35:27

智慧城市物聯(lián)網(wǎng)社區(qū)

2024-07-17 09:39:05

軟件版本號管理

2019-12-02 14:22:01

浪費云計算支出

2018-11-08 14:39:50

Excel表結構數(shù)據(jù)
點贊
收藏

51CTO技術棧公眾號

欧美极品欧美精品欧美| 国产在线日韩在线| 三级黄色片免费观看| www在线视频| 成人av电影在线网| 91精品国产自产91精品| 五级黄高潮片90分钟视频| 澳门成人av网| 国产精品国产三级国产aⅴ无密码| 国产欧美在线播放| 殴美一级黄色片| 亚洲精品不卡在线观看| 午夜私人影院久久久久| 欧美日韩一区二区视频在线| 亚洲性在线观看| 欧美日韩视频| 亚洲欧洲黄色网| 午夜激情影院在线观看| 97人澡人人添人人爽欧美| 国产亚洲福利社区一区| 国产主播欧美精品| 国产午夜福利片| 欧美日韩在线网站| 欧美videos中文字幕| 国产精品wwwww| 久久99精品久久久久久野外| 94色蜜桃网一区二区三区| 国产精品网红直播| 久久精品国产亚洲av无码娇色| 香蕉视频一区| 欧美高清视频在线高清观看mv色露露十八 | 久久亚洲二区| 久久综合88中文色鬼| 爱爱的免费视频| 日韩欧美中文在线观看| 色8久久人人97超碰香蕉987| 免费的av在线| 成人午夜在线观看视频| 成人黄色一级视频| 国产欧美日韩91| 国产www在线| 亚洲天堂激情| 久久国产一区二区三区| 亚洲AV无码国产成人久久| 一区二区三区视频免费视频观看网站| 婷婷成人综合网| 国产精品免费看久久久无码| 国产小视频在线| 成人黄色av电影| 91视频免费在线| 中文字幕永久在线| 亚洲欧美久久久| 久久久久久网址| 日本aⅴ在线观看| 久久中文视频| 亚洲精品美女久久久| 亚洲黄色av片| 亚洲人体在线| 欧美日韩高清在线| 在线观看国产中文字幕| 日韩精品三区| 91激情五月电影| av免费观看大全| 成年人视频免费在线播放| 亚洲欧美电影院| 可以在线看黄的网站| 深夜福利免费在线观看| 播五月开心婷婷综合| 国产日韩亚洲精品| 99精品在线看| 蜜桃av一区二区| 国产免费观看久久黄| 亚洲综合精品国产一区二区三区| 日本成人在线一区| 国产va免费精品高清在线| 黄色一级视频免费看| 久久精品人人| 国产精品吊钟奶在线| 加勒比在线一区| 日韩精品亚洲一区二区三区免费| 国产成人精品av| 国产精品高清无码| 久久精品久久精品| 成人在线视频网站| 亚洲av无码国产精品永久一区| 国产一区二区三区精品欧美日韩一区二区三区 | re久久精品视频| 色系列之999| 伊人在线视频观看| 国产综合网站| 热99精品只有里视频精品| www.久久久久久久| 奇米影视一区二区三区小说| 成人两性免费视频| 午夜精品久久久久久久爽| 国产xxx精品视频大全| 精品欧美一区二区久久久伦| 你懂的好爽在线观看| 国产亚洲精品aa午夜观看| 亚洲国产精品综合| 先锋成人av| 激情久久av一区av二区av三区 | 男人的天堂亚洲在线| 国产福利精品av综合导导航| 在线观看免费视频一区| 国产成人综合在线播放| 亚洲精品免费一区二区三区| 四虎电影院在线观看| 国产亚洲成年网址在线观看| 精品少妇人妻av一区二区| 女囚岛在线观看| 色婷婷综合久久久久中文| 一级黄色录像在线观看| 国产精品xxx在线观看| 亚洲丝袜一区在线| 欧美色图一区二区| 羞羞视频在线观看欧美| 91香蕉国产在线观看| 五十路在线观看| 中文字幕一区二区三区四区| 91丨porny丨探花| 日韩成人一区| 亚洲情综合五月天| 紧身裙女教师波多野结衣| 国产农村妇女精品一二区| 国产中文字幕91| 亚洲 国产 欧美 日韩| 亚洲丝袜另类动漫二区| 欧美一区二区三区爽大粗免费| 不卡的国产精品| 亚洲男人第一av网站| 手机免费观看av| 免费日韩av| 俄罗斯精品一区二区三区| av中文字幕在线| 婷婷久久综合九色综合伊人色| 日本国产一级片| 最新国产精品视频| 欧美激情亚洲自拍| 亚洲网站在线免费观看| 久久综合五月天婷婷伊人| 狠狠干视频网站| 99久久综合国产精品二区| 欧美精品一区二区三区蜜桃| 国产精品精品软件男同| 日韩黄色免费电影| 国产女人水真多18毛片18精品| caopen在线视频| 欧美卡1卡2卡| ass极品国模人体欣赏| 欧美资源在线| 精品久久久久久一区| 欧洲黄色一区| 日韩丝袜情趣美女图片| 亚洲不卡的av| 日韩av中文字幕一区二区三区| 精品亚洲一区二区三区四区五区高| 99在线播放| 日韩一区二区在线观看视频播放| 影音先锋男人看片资源| 久久精品国产精品亚洲精品| 亚洲高清资源综合久久精品| 亚洲天堂1区| 一本色道久久88综合日韩精品| 免费视频久久久| 久久久国产精品麻豆| 漂亮人妻被中出中文字幕| 欧洲亚洲视频| **欧美日韩vr在线| 精品国产无码AV| 一区二区三区中文在线| 四川一级毛毛片| 欧美日本免费| 狠狠色综合欧美激情| 高清在线视频不卡| 日韩av在线免费看| 999视频在线| 2021中文字幕一区亚洲| 北条麻妃在线视频| 国产一区二区三区网| 国产精品自产拍在线观看| 麻豆传媒在线免费看| 日韩视频一区二区三区| 日韩av无码中文字幕| av电影一区二区| 日日摸日日碰夜夜爽av| 精品国产aⅴ| 国产精品一区av| 18av在线视频| 亚洲精品久久久久国产| 久久久成人免费视频| 久久亚洲精精品中文字幕早川悠里 | 国产精品理伦片| 日本黄色www| 亚洲私人影院| 欧美最大成人综合网| 欧美成人福利| 欧美黑人xxxx| 免费一级在线观看| 欧美一区二区在线观看| 久久久综合久久久| 99视频一区二区| 丰满少妇在线观看| 亚洲最新色图| 产国精品偷在线| 久久青青视频| 久久成人一区二区| 日产精品久久久久久久性色| 国产对白叫床清晰在线播放| 亚洲情侣在线| 国产视频在线观看一区| 欧美黑人疯狂性受xxxxx野外| 国产一区二区三区久久精品 | 欧美日韩精品一区二区天天拍小说 | 在线观看不卡视频| 免费毛片在线播放免费| 国产日韩视频一区二区三区| 俄罗斯女人裸体性做爰| 一本色道久久精品| 一区二区欧美日韩| 色爱综合av| 91在线网站视频| 综合久久2023| 久久全国免费视频| 久久五月精品| 在线视频亚洲欧美| 天天干,夜夜操| 日韩欧美美女一区二区三区| 在线免费观看国产精品| 午夜影视日本亚洲欧洲精品| 久久久视频6r| 波多野结衣在线一区| 超碰中文字幕在线观看| 日韩二区三区四区| 久色视频在线播放| 中文字幕日韩一区二区不卡 | 国产精品久久久久av免费| 成人日韩欧美| 色妞久久福利网| 国产三级电影在线观看| 亚洲精品美女久久久久| 亚洲美女性生活| 日韩欧美在线网站| 一本久道久久综合无码中文| 色香蕉成人二区免费| 久草国产精品视频| 亚洲综合色噜噜狠狠| youjizz亚洲女人| 久久亚洲一区二区三区明星换脸| 污污免费在线观看| 国产不卡在线播放| 女王人厕视频2ⅴk| 国产精品一级二级三级| 黄色a级三级三级三级| 激情欧美一区二区三区在线观看| 69久久久久久| 人禽交欧美网站| 手机视频在线观看| 麻豆久久久久久久| 亚洲 国产 图片| 国产在线视频不卡二| 一起操在线视频| 久久99精品国产.久久久久| 欧美日韩在线观看不卡| 免费看黄色91| 国产九九在线观看| 精品在线一区二区三区| 亚洲欧美日韩三级| 青青草原综合久久大伊人精品优势| 蜜臀av午夜一区二区三区 | www.精品在线| 麻豆成人久久精品二区三区小说| 欧美三级午夜理伦三级富婆| 久久99久国产精品黄毛片色诱| 免费精品99久久国产综合精品应用| 精品一区二区三区不卡| 亚洲制服在线观看| 国产91对白在线观看九色| 北京富婆泄欲对白| 91在线精品秘密一区二区| 日本黄色特级片| 久久亚洲一区二区三区明星换脸| 动漫精品一区二区三区| 国产精品婷婷午夜在线观看| 免费在线观看黄色小视频| 国产精品久久久久久久岛一牛影视 | 国产精品探花一区二区在线观看| 91丝袜国产在线播放| japanese中文字幕| 最近日韩中文字幕| 日韩三级av在线| 51精品国自产在线| 欧洲综合视频| 欧美国产亚洲视频| 狠狠久久伊人中文字幕| 国产99视频精品免费视频36| 精品国内自产拍在线观看视频 | 在线看片中文字幕| 亚洲国产精品影院| 亚洲一区二区影视| 精品无人区乱码1区2区3区在线| 黄a在线观看| 国产精品69精品一区二区三区| 97超碰成人| 一区二区不卡在线观看| 久久蜜桃精品| 日本一卡二卡在线| 亚洲激情校园春色| 依依成人在线视频| 亚洲免费人成在线视频观看| 女囚岛在线观看| 亚洲精品免费一区二区三区| 成人精品电影| 18岁视频在线观看| 成人性生交大片免费看中文| 黄色一级大片在线免费观看| 色偷偷88欧美精品久久久| 日本精品久久久久| 精品综合久久久久久97| 色8久久久久| 亚欧精品在线| 日韩不卡一区二区三区| 粉嫩av蜜桃av蜜臀av| 午夜影院久久久| 性做久久久久久久| 久久99精品国产99久久6尤物 | 51午夜精品国产| 69xxxx欧美| 国产精品99一区| 精品72久久久久中文字幕| 日韩在线综合网| 91在线免费视频观看| 久草视频在线观| 日韩精品中文字幕在线| 1区2区3区在线| 国产精品一区二区三区免费| 欧美午夜不卡| 绯色av蜜臀vs少妇| 亚洲主播在线播放| 亚洲国产精品18久久久久久| 欧美日韩xxxxx| 7m精品国产导航在线| 国产乱子伦精品无码专区| 国产盗摄视频一区二区三区| 久草视频在线资源| 精品粉嫩超白一线天av| av影片在线| 久久精品国产一区二区三区日韩 | 手机在线免费毛片| 亚洲免费在线看| www.国产精品视频| 午夜精品久久久久久久久久久久| 欧美人与动xxxxz0oz| 欧美成人免费高清视频| 国产欧美日产一区| 国产又粗又猛视频| 欧美成人免费大片| 成人av动漫| 成人小视频在线看| 亚洲国产精品99久久久久久久久| 国产一区二区网站| 欧美疯狂做受xxxx高潮| 国产色噜噜噜91在线精品| 国产成人黄色片| 日本一区二区不卡视频| 一本色道久久综合熟妇| 欧美巨猛xxxx猛交黑人97人| 精品av导航| 日韩大片一区二区| 亚洲精品成人少妇| 视频一区二区三区在线看免费看| 国产成人精品日本亚洲| 欧美gvvideo网站| 亚洲乱妇老熟女爽到高潮的片 | 在线日韩一区| www.久久久精品| 亚洲观看高清完整版在线观看| 国产一级在线观看| 亚洲淫片在线视频| 国产视频一区欧美| 蜜桃av免费观看| 亚洲国产毛片完整版| 日韩中文视频| 欧美亚洲黄色片| 中文字幕av一区 二区| 午夜精品久久久久久久爽 | 午夜视频一区二区在线观看| 久久亚洲中文字幕无码| 国产精品萝li| 图片区 小说区 区 亚洲五月| 国产精品亚洲片夜色在线| 亚洲国产影院| 自拍偷拍第9页| 亚洲精品电影网在线观看| 国产第一亚洲| 女人喷潮完整视频| 亚洲精品老司机| 成人精品一区二区| 精品国产一区二区三区麻豆免费观看完整版 | 国产精品乱码久久久久久 |