中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于python2中的unicode和str以及python3中的str和bytes是怎樣的

發布時間:2021-10-14 13:59:21 來源:億速云 閱讀:134 作者:柒染 欄目:編程語言

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

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

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

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


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

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

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

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編碼進行編碼, 即調用encode('utf-8')方法生成byte數組類型的結果. 相反對于byte數組進行解碼, 生成unicode字符串. 這個新手表示理解不能, 不過熟悉了就見怪不怪了.

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

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

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


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

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

以上就是關于python2中的unicode和str以及python3中的str和bytes是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

理塘县| 大洼县| 西昌市| 奉贤区| 灵山县| 平武县| 永平县| 宜都市| 通辽市| 城口县| 周宁县| 托里县| 沅陵县| 巴林左旗| 陈巴尔虎旗| 昌平区| 宜丰县| 宣恩县| 裕民县| 杨浦区| 瑞金市| 罗源县| 都江堰市| 本溪| 沙雅县| 西乌珠穆沁旗| 木里| 萨嘎县| 洪雅县| 古丈县| 永修县| 深州市| 吴川市| 丹东市| 区。| 平乐县| 嫩江县| 永善县| 松江区| 崇州市| 图木舒克市|