日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

不要再问我Python2和Python3的Unicode 问题啦!

發(fā)布時間:2025/3/20 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不要再问我Python2和Python3的Unicode 问题啦! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫在之前

字符編碼問題幾乎是會跟隨我們整個編程生涯的一大魔障,一不小心各種玄學(xué)的問題就會接踵而至,防不勝防,尤其是對初學(xué)者來說,碰到編碼問題簡直是就是加快了踏上從入門到放棄的傳送帶。

字符集問題

很多時候在使用 Python 編程的時候,如果不使用 Unicode,處理中文的時候會出現(xiàn)一些讓人頭大的事情,當然這個是針對 Python2 版本來說的,因為 Python3 默認使用的是 Unicode。具體如下所示:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> name = '李四'>>> name'??????'>>> print(name)李四>>> len(name)6>>> name[:1]'?'>>> print(name[:1])

通過上面的例子可以看到,我們在代碼中使用中文以后,求字符串的長度和對其進行切片操作都沒有按照我們預(yù)想的方式輸出結(jié)果,當然有懂得讀者知道這個問題用 Unicode 就可以輕松解決,但真的是輕松解決么?如果你對字符集編碼只是半瓶子醋,新出現(xiàn)的問題又會讓你頭大如斗。具體如下所示:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> name = u'李四'>>> nameu'李四'>>> name[:1]u'李'>>> print(name[:1])李>>> with open('./Desktop/test', 'a') as f:... f.write(name)... Traceback (most recent call last):File "<stdin>", line 2, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

上述的代碼出現(xiàn)了錯誤,報錯的原因很簡單,因為我們定義了一個 Unicode 字符串 u’李四’,然后我們想把它保存到文本文件里,但是我們沒有指定文件的編碼,所以默認的是 ASCII 編碼,顯然用 Unicode 表示的漢字是無法用 ASCII 碼存儲的,所以就拋出了 UnicodeEncodeError 異常。

Python2 & Python3 的 Unicode

前面鋪墊的夠多,現(xiàn)在我們算是正式來看 Python 中的字符串與字符編碼之間的調(diào)用。

首先來說 Python3,Python3 里有兩種表示字符序列的類型,分別是 bytes 和 str,bytes 的實例包含 8 位值,str 的則包含 Unicode 字符。Python2 中也有兩種表示字符序列的類型,分別是 str 和 Unicode,它與 Python3 的不同是,str 的實例包含原始的 8 位值,而 Unicode 的實例包含 Unicode 字符。這是什么意思呢?也就是說 Python3 中字符串默認為 Unicode,但是如果在 Python2 中需要使用 Unicode,必須要在字符串的前面加一個 「u」前綴,形式參考上面例子中的寫法。

當然了,在 Python2 中也可以默認使用 Unicode 的字符串,執(zhí)行下面的操作即可:

from __future__ import unicode_literals

Python 字符串有 encode 和 decode 方法,用這兩個可以對字符串進行編碼或解碼,我們來看一個在 Python2 下運行的例子:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> name = '李四'>>> name'??????'>>> my_name = name.decode('utf8')>>> my_nameu'李四'>>> print(my_name)李四>>> my_name.encode('utf-8')'??????'

既然我們知道了 encode 用于編碼,decode 用于解碼,那么對于之前我們拋出異常的那個例子我們可以手動解決,具體如下所示:

>>> with open('./Desktop/data.txt', 'a') as f:... f.write(name.encode('utf-8'))... >>> with open('./Desktop/data.txt', 'r') as f:... data = f.read()... >>> data.decode('utf-8')u'李四'

上述代碼是字符串較短的情況,如果需要寫入的字符串很多,每次都要手動進行編碼將會變的非常低效,Python2 中有個「codecs」模塊可以解決這個問題:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> import codecs>>> nameu'李四'>>> with codecs.open('./Desktop/data.txt', 'w', encoding='utf-8') as f:... f.write(name)... >>> with codecs.open('./Desktop/data.txt', 'r', encoding='utf-8') as f:... data = f.read()... >>> datau'李四'

而在 Python3 中內(nèi)置的 open 就已經(jīng)支持指定編碼風(fēng)格:

>>> name = '李四'>>> name'李四'>>> with open('./Desktop/data.txt', 'w', encoding='utf-8') as f:... f.write(name)...

把 Unicode 字符表示為二進制的數(shù)據(jù)有很多種辦法,最常見的就是 utf-8,但是這里需要我們明白的是,Unicode 是表現(xiàn)形式,utf-8 是存儲形式,utf-8 雖然是使用最廣泛的編碼,但也僅僅是 Unicode 的一種存儲形式罷了。

當然字符編碼的問題還有很多,我也不可能面面俱到,最后我還是希望你可以在一開始的時候就徹底的搞定字符編碼的東西,拿出一些時間來好好研究一下,不然這個東西會成為你編碼路上揮之不去的“噩夢”。

總結(jié)

以上是生活随笔為你收集整理的不要再问我Python2和Python3的Unicode 问题啦!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。