您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關關于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是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。