精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

老女人性淫交视频| 91人成网站www| 无码精品一区二区三区在线播放| 日韩伦理精品| 国产精品亲子乱子伦xxxx裸| 亚洲最大福利视频| 中文字幕精品三级久久久| 欧美日韩色图| 日韩免费视频一区| 亚洲国产精品久久久久爰色欲| 91亚洲精选| 国产盗摄一区二区三区| 国产视频一区在线| 亚洲77777| 日本中文字幕中出在线| 久久综合九色综合欧美亚洲| 欧美精品在线免费播放| 熟妇人妻久久中文字幕| 欧美视频免费看| 黄色成人在线免费| 四虎永久免费网站| 精品亚洲成a人片在线观看| 国产一区二区在线免费观看| 欧美中文在线字幕| 欧美日韩一级大片| 日韩a一区二区| 日韩成人在线视频| 色黄视频免费看| 浪潮色综合久久天堂| av亚洲精华国产精华| 国产伊人精品在线| 久久夜色精品国产噜噜亚洲av| 欧美1区2区| 国产一区二区三区丝袜 | 美女精品在线观看| 亚洲大胆人体视频| 天天干天天av| 爱情电影社保片一区| 亚洲九九爱视频| 91在线高清免费观看| 国产又黄又猛又粗又爽| 午夜性色一区二区三区免费视频| 在线电影中文日韩| 日本黄色网址大全| 亚洲四虎影院| 午夜精品福利一区二区蜜股av| 中国 免费 av| www.蜜臀av.com| 日本午夜一区二区| 91精品国产免费久久久久久| 欧美成人三级在线观看| 97精品国产福利一区二区三区| 影音先锋日韩资源| 成人丝袜视频网| 亚洲精品日韩激情在线电影| 在线观看日批视频| 成人精品视频| 亚洲欧美成人网| 国产日韩视频一区| 黑人巨大亚洲一区二区久| 亚洲国产日韩一区二区| 亚洲乱码日产精品bd在线观看| 日本三级视频在线播放| 国产精品久久久一本精品 | 久久电影在线| 欧美精品一区二区三区在线| 亚洲精品第二页| 麻豆精品99| 日韩精品中文字幕久久臀| 草草影院第一页| 久久不见久久见国语| 亚洲欧美日韩直播| 日韩av片在线| 91精品电影| 欧美日韩国产第一页| 国产精品6666| 久久久久久自在自线| 日本一区二区在线免费播放| 国产美女www| 图片区亚洲欧美小说区| 久久精品国产2020观看福利| 一区视频免费观看| 亚洲手机在线| 热久久视久久精品18亚洲精品| 四虎影院在线免费播放| 午夜日本精品| 91精品国产91久久久久福利| 人人爽人人爽人人片av| 六月丁香综合在线视频| 444亚洲人体| 无码精品黑人一区二区三区| 久久日韩粉嫩一区二区三区| 一区二区精品在线观看| 日漫免费在线观看网站| 国产很黄免费观看久久| 国产精品日韩一区二区免费视频| 五月天激情开心网| 欧美激情一区二区三区不卡| 在线观看av的网址| 日韩免费va| 欧美一级午夜免费电影| 欧美一级片黄色| 精品国产乱码久久久| 久久精品视频在线播放| 国产精品 欧美 日韩| 日韩成人一区二区三区在线观看| 欧美激情在线狂野欧美精品| 国产成人在线视频观看| 久久av老司机精品网站导航| 国产精品成人一区二区三区| 国产女主播在线直播| 一区二区三区日韩| 亚洲性生活网站| 91蜜桃臀久久一区二区| 在线激情影院一区| 日本午夜小视频| 久久99热这里只有精品| 精品国产日本| www.在线视频| 色婷婷国产精品久久包臀| 国产成人强伦免费视频网站| 国产一区二区精品久| 欧美疯狂性受xxxxx另类| 中文在线免费观看| 99精品视频在线免费观看| 国产精品久久九九| 2021av在线| 精品福利樱桃av导航| 日本一二三区在线| 欧美在线色图| 欧亚精品在线观看| 亚洲美女综合网| 中文字幕一区免费在线观看| 国产黄色特级片| 好吊妞视频这里有精品 | 国产ts丝袜人妖系列视频| 68国产成人综合久久精品| 国产精品电影在线观看| 男女视频在线观看| 天天综合网 天天综合色| 免费欧美一级片| 91精品一区国产高清在线gif| 日韩女优在线播放| 欧洲天堂在线观看| 狠狠综合久久av一区二区小说 | 精品日本高清在线播放| 麻豆网站免费观看| 国产电影一区二区在线观看| 国产成人精品免高潮在线观看| 黄色片网站在线免费观看| 国产福利一区二区| 99精品一区二区三区的区别| 91成人在线| 亚洲人午夜色婷婷| 亚洲日本视频在线观看| av电影在线观看一区| www.亚洲视频.com| 成人爽a毛片| 欧美国产日韩免费| 肥臀熟女一区二区三区| 亚洲一区在线观看免费| 岛国大片在线免费观看| 亚洲美女视频| www 成人av com| 欧美另类tv| 亚洲白虎美女被爆操| 国产网友自拍视频| 91啪九色porn原创视频在线观看| 中文字幕无码精品亚洲35| 久久精品福利| 538国产精品一区二区在线 | 88av在线播放| 国产视频一区在线观看一区免费| 激情视频一区二区| 高清电影一区| 日韩中文视频免费在线观看| 国产精品无码免费播放| 一区二区在线观看视频| 青青草视频网站| 久久影院亚洲| 一区二区不卡在线观看| 亚洲精品一二三**| 51精品在线观看| а天堂8中文最新版在线官网| 亚洲乱码国产乱码精品精98午夜 | 日本精品人妻无码77777| 国产精品自拍三区| 日韩精品 欧美| 狠狠综合久久av一区二区蜜桃| 国产精品天天狠天天看| 污污视频在线看| 精品视频久久久久久| 亚洲无码久久久久久久| 夜色激情一区二区| 中文字幕国产综合| 激情久久五月| 蜜桃狠狠色伊人亚洲综合网站| a视频在线免费看| 欧美精品一区二区在线观看| 7799精品视频天天看| 中文字幕视频一区二区三区久| 性一交一黄一片| 久久久夜夜夜| 成人在线观看www| 日本成人中文| 国产欧美精品在线播放| 欧美黑人xx片| 国产一区二区三区在线视频| 国产浮力第一页| 综合av第一页| xxxxxx黄色| 蜜臀久久99精品久久久久宅男| 中文精品无码中文字幕无码专区| 久久不见久久见国语| 91国产在线播放| 日韩精品麻豆| 午夜精品美女自拍福到在线| 求av网址在线观看| 亚洲精品福利视频| 99久久精品日本一区二区免费| 欧美性xxxx极品hd满灌| 久久国产精品波多野结衣av| 中文字幕欧美区| av网站免费在线播放| 国产最新精品免费| 天堂中文视频在线| 国产女优一区| 国产乱子伦精品无码专区| 日韩综合网站| 日韩av不卡播放| 日韩激情啪啪| 国产精品视频入口| 精品国产一级| 国产区精品在线观看| 成人性教育av免费网址| 久久久免费精品| 亚洲精品视频网| 欧美日韩精品一区二区三区四区 | 91亚洲一区精品| 丰满少妇一区| 国产精品xxxxx| 成人香蕉视频| 日韩免费在线看| 中文在线最新版地址| 91国偷自产一区二区三区的观看方式| 伊人手机在线| 欧美福利在线观看| av在线免费网址| 久久九九国产精品怡红院| 在线播放毛片| 色噜噜狠狠色综合网图区| 国产大片在线免费观看| 亚洲日本中文字幕免费在线不卡| 亚洲日本香蕉视频| 亚洲护士老师的毛茸茸最新章节| 性一交一乱一色一视频麻豆| 欧美一区二区三区人| 99er热精品视频| 欧美一级在线观看| www.日日夜夜| 精品久久五月天| 老熟妇高潮一区二区高清视频| 欧美不卡在线视频| 高h震动喷水双性1v1| 精品国产污污免费网站入口| 色婷婷视频在线| 在线日韩一区二区| 国产成人自拍网站| 中文字幕一区二区三区不卡在线| 极品尤物一区二区| 亚洲欧美色一区| 粉嫩av性色av蜜臀av网站| 一区二区高清在线| 国产一级在线观看视频| 欧美日韩国产丝袜美女| 久久国产视频一区| 欧美三级在线播放| 日本在线播放视频| 日本精品视频一区二区| 最近中文字幕在线免费观看| 亚洲最大成人综合| 日本天堂在线视频| 欧美午夜激情视频| 国产精品尤物视频| 欧美顶级少妇做爰| 91黑人精品一区二区三区| 欧美主播一区二区三区美女| 亚洲一级在线播放| 精品久久久久一区二区国产| 亚洲av成人无码网天堂| 国产一区二区成人| 黄色一级片在线观看| 久久久久久久激情视频| 国产欧美一区二区三区精品酒店| 国产精品久久久久久久久久久久久 | 久久久久国产精品麻豆| 欧美在线a视频| 成人妖精视频yjsp地址| 欧洲美一区二区三区亚洲| 中文字幕一区在线| 亚洲免费激情视频| 欧美日韩免费视频| 亚洲黄色精品视频| 国产香蕉97碰碰久久人人| 最爽无遮挡行房视频在线| 日产精品久久久一区二区福利| 亚洲欧美一级| 欧美不卡三区| 在线中文字幕第一区| 黄色影院一级片| 国产精品99久久久久久久vr| 一区二区三区免费在线观看视频| 1000精品久久久久久久久| 伊人手机在线视频| 欧美成人女星排名| 91社区在线高清| 欧美在线激情视频| 99re8这里有精品热视频免费 | ...中文天堂在线一区| 中文字幕一区二区三区手机版 | 国产黄色片在线播放| 欧美极品美女电影一区| 全球最大av网站久久| 久久免费视频1| 你懂的亚洲视频| 超碰av在线免费观看| 成人avav影音| 国产黄色片在线免费观看| 欧美亚洲国产一区在线观看网站 | 色豆豆成人网| 国产伦精品一区二区三区四区视频 | 久久久久久成人网| 欧美视频国产精品| 欧美一级一区二区三区| 久久视频在线视频| 国产a亚洲精品| 日本不卡一区二区三区视频| 亚洲国产日本| 香蕉在线观看视频| 亚洲免费在线看| 伊人免费在线观看| 亚洲一二三在线| 怡红院成人在线| 欧美极品一区| 国产欧美亚洲一区| 中文字幕一区二区人妻电影丶| 伊人夜夜躁av伊人久久| 国产精品无码天天爽视频| 最近2019年好看中文字幕视频| 日韩成人影音| 日本精品一区| 久久三级视频| 中文字幕丰满乱子伦无码专区| 午夜精品aaa| 天堂在线资源8| 97免费中文视频在线观看| 你懂的在线观看一区二区| 99在线精品免费视频| 99久久精品国产精品久久| 欧美成人aaaaⅴ片在线看| 亚洲成人1234| 香蕉伊大人中文在线观看| 久久精品99久久| 老鸭窝毛片一区二区三区| 久久av无码精品人妻系列试探| 色综合天天综合狠狠| 国产精品免费播放| 国产欧美日韩中文字幕在线| 天天做天天爱天天综合网| 激情久久综合网| 亚洲综合色婷婷| 老牛影视av牛牛影视av| 57pao成人国产永久免费| 欧美日韩一区二区三区视频播放| 韩国视频一区二区三区| 亚洲天堂中文字幕| 蜜桃91麻豆精品一二三区| 国外色69视频在线观看| 亚洲丝袜啪啪| 在线看的黄色网址| 樱花草国产18久久久久| 亚洲色图狠狠干| 国产精品视频在线播放| 亚洲国产精品91| 亚洲av成人片色在线观看高潮| 欧美性猛交xxxx乱大交| 在线播放日本| 国产亚洲一区二区三区在线播放| 西西裸体人体做爰大胆久久久| 国产精品一二三区在线观看| 欧美精品在欧美一区二区少妇| 尤物视频在线看| 久久精品成人一区二区三区蜜臀| 男人的天堂久久精品| 少妇影院在线观看| 亚洲视频第一页| 精品三级国产| 国产精品69页| 一区二区三区在线观看欧美| 欧美巨乳在线|