成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

關(guān)于python2中的unicode和str以及python3中的str和bytes是怎樣的

本篇文章給大家分享的是有關(guān)關(guān)于python2中的unicode和str以及python3中的str和bytes是怎樣的,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在洛川等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),洛川網(wǎng)站建設(shè)費用合理。

如果你 經(jīng)常遇到這種錯誤提示的信息: UnicodeEncodeError: ‘a(chǎn)scii’ codec can’t encode characters in position 0-1: ordinal not in range(128), 或者杯具的發(fā)現(xiàn)明明在Eclipse中寫的程序能夠正常運行然后到了終端下面就跳出以上的一段話.
那么, 就證明你和我一樣, 遇到了悲催的Python的編碼問題了.

之前在用Python語言寫我的畢業(yè)設(shè)計, 然后各種沒有問題, 直到整個東西完成了, 突發(fā)奇想想去試一下對中文的支持. 然后你懂的, 就彈出了以上一串惡心的錯誤提示, 然后改半天, 各種改, 各種錯誤, 然后各種想砸鍵盤. 其實之前的一篇日志中也說到了, 解決這一類的問題最好的方法就是在程序開頭加上以下幾行代碼:

import sys
reload(sys)
sys.setdefaultencoding(“utf-8″)


那么就可助你解決幾乎95%的這種問題, 但是如果想刨根問底的話, 就需要去了解很多東西了.

首先, 這個就是Python語言本身的問題. 因為在Python 2.x的語法中, 默認的str并不是真正意義上我們理解的字符串, 而是一個byte數(shù)組, 或者可以理解成一個純ascii碼字符組成的字符串, 與Python 3中的bytes類型的變量對應(yīng); 而真正意義上通用的字符串則是unicode類型的變量,
它則與Python 3中的str變量對應(yīng). 本來應(yīng)該用作byte數(shù)組的類型, 卻被用來做字符串用, 這種看似奇葩的設(shè)定是Python 2一直被人詬病的東西, 不過也沒有辦法, 為了與之前的程序保持兼容.

在Python 2中作為兩種字符串類型, str與unicode之間就需要各種轉(zhuǎn)換的方式. 首先是一種顯式轉(zhuǎn)換的方式, 就是encode和decode兩種方法. 在這里這兩貨的意思很容易被搞反, 科學(xué)的調(diào)用方式是:

str --- decode方法 ---> unicode
unicode --- encode方法 ---> str

比如:

>>> type('x')
<type 'str'>
>>> type('x'.decode('utf-8'))
<type 'unicode'>
>>> type(u'x'.encode('utf-8'))
<type 'str'>


這個邏輯是這樣的, 對于unicode字符串使用utf-8編碼進行編碼, 即調(diào)用encode('utf-8')方法生成byte數(shù)組類型的結(jié)果. 相反對于byte數(shù)組進行解碼, 生成unicode字符串. 這個新手表示理解不能, 不過熟悉了就見怪不怪了.

另外是隱式的轉(zhuǎn)換, 和C語言中的int轉(zhuǎn)double類似, 當一個unicode字符串和一個str字符串進行連接的時候會默認自動將str字符串轉(zhuǎn)換成unicode類型然后再連接. 而這個時候使用的編碼方式則是系統(tǒng)所默認的編碼方式. 使用:

import sys
print sys.getdefaultencoding()


可以得到當前默認的編碼方式, 是不是'ascii'? 是的話就恭喜你中彩了~!! 在這個時候如果有以下一行代碼就保證會出錯:

>>> x = u'喵'
>>> x
u'\u55b5'
>>> y = x.encode('utf-8')
>>> x + y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)


x是unicode類型的變量, y是x經(jīng)過encode后的結(jié)果是str類型的變量. x + y的時候, 首先要將y轉(zhuǎn)換成unicode字符串, 那么使用什么編碼格式轉(zhuǎn)換呢, 用utf-8還是gb2312或者還是utf-16? 這個時候就要根據(jù)sys.getdefaultencoding()來確定,
而sys.getdefaultencoding()是'ascii'編碼, 在ascii字符表中不存在0xe5這種大于128的字符存在, 所以當然報錯啦! 通過加入

import sys
reload(sys)
sys.setdefaultencoding(“utf-8″)


則可以將默認的編碼轉(zhuǎn)換格式變成utf-8, 且大多數(shù)情況下, 程序中的字符串是通過utf-8來編碼的, 所以只要加上以上三行就可以了.

但是有沒有覺得, 加上這些會使得代碼有些dirty? 咳, 至少對于我來說確實很dirty. 所以我覺得平時寫程序的過程中要養(yǎng)成盡量使用顯示的轉(zhuǎn)換的習(xí)慣, 并且要明確某個函數(shù)返回的到底是str還是unicode, 凡是str的主動decode成unicode, 不要將兩者混淆掉, 這樣寫出來的代碼才比較干凈. 此外還可以在代碼最上方加入'from
__future__ import unicode_literals'可以默認將用戶自定義字符串變成unicode類型.
最后我想大吼一聲Python 2.x中str不是字符串, 而是BYTE數(shù)組~!

以上就是關(guān)于python2中的unicode和str以及python3中的str和bytes是怎樣的,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享標題:關(guān)于python2中的unicode和str以及python3中的str和bytes是怎樣的
URL鏈接:http://jinyejixie.com/article40/jjphho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、建站公司、營銷型網(wǎng)站建設(shè)、標簽優(yōu)化網(wǎng)頁設(shè)計公司、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
星子县| 珲春市| 德钦县| 鄄城县| 老河口市| 准格尔旗| 白水县| 邹平县| 沽源县| 上栗县| 宜城市| 邯郸县| 勃利县| 三门峡市| 会泽县| 淳化县| 金秀| 萝北县| 瑞昌市| 阿城市| 天长市| 三门县| 乌海市| 汉川市| 平遥县| 阳江市| 武川县| 三江| 高雄县| 通山县| 遂昌县| 达孜县| 阳原县| 宝清县| 靖江市| 南平市| 富源县| 玉树县| 宜兰县| 昌江| 腾冲县|