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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》

發(fā)布時間:2023/12/20 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章的原文鏈接如下:

https://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes

我自己的話,堅(jiān)持使用python2.x,因?yàn)橐呀?jīng)對編碼比較熟悉了,這篇文章舉了兩個例子,我先來重現(xiàn)下,首先是

第一個問題,也就是該作者提到的編碼問題

他的原文代碼是這樣的:

import chardet def print_string(string):try:print(u"%s" % string)except UnicodeError:print u"%s" % unicode(byte_string, encoding=chardet.detect(string)['encoding'])print_string(u"??".encode("latin-1"))import sys reload(sys) sys.setdefaultencoding('utf-8')print(key_in_dict('??'))評論下,首先他的上半部分代碼是無法運(yùn)行的,只有下半部分代碼可以運(yùn)行,并且他的下半部分代碼中的key_in_dict在文章的后半部分才定義,而且他給出的字典中也并沒有'??'。
我直接運(yùn)行了如下代碼:

#-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') print('??')
我是linux下工作的,這個輸出并沒什么問題。

------------------------------------------------------第一部分解讀結(jié)束----------------------------------------------------------------------------------------------

第二個問題,也就是該作者提到dictionary行為異常問題

他的原文代碼是這樣的:

#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key)if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False #-*- coding: utf-8 -*-print(key_in_dict('你好')) print(key_found_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))print('------utf-8------')import sys reload(sys) sys.setdefaultencoding('utf-8')print(key_in_dict('你好')) print(key_found_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))以上該作者的代碼可以分解為以下兩部分。

一、

#-*- coding: utf-8 -*- d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key):if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False#-*- coding: utf-8 -*-print(key_in_dict('你好')) print(key_found_in_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))運(yùn)行結(jié)果是:

True
True
False
/home/appleyuchi/桌面/pythonprojects/jianshu/d09778f4e055/encode.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
? if _key == key:
False
------utf-8------

可以看到,解釋器都已經(jīng)提醒了無法做==運(yùn)算

先說下這個代碼寫法有什么問題,dict里面都已經(jīng)指名了是str類型,查找的時候卻試圖使用unicode類型,這個本身就是寫法錯誤,不能把鍋甩到python的設(shè)計(jì)機(jī)制上面。

二、

#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key):if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False import sys reload(sys) sys.setdefaultencoding('utf-8') print(key_in_dict('你好')) print(key_found_in_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))運(yùn)行結(jié)果:

True
True
False
True
[Finished in 0.0s]

和前面一樣,首先最后兩句print是不應(yīng)該這么寫的,因?yàn)樽髡呓o的dicts里面存儲的本身就是str類型(這里并不是在批判作者,而是有些初學(xué)者確實(shí)可能這么來寫),不應(yīng)該去一個不存在unicode類型key-value數(shù)值對里面的字典里去尋找unicode類型的key

就好比說,你去游樂園的時候,你會去鬼屋里面買東西嗎?鬼屋里是嚇人的場景,根本沒有吃的喝的,你是不是非要去鬼屋里買東西呢?

同樣的,該作者的寫作意圖是,有些dicts里根本沒有unicode類型,但是一些初學(xué)者試圖去查找unicode類型的key,所以,再次強(qiáng)調(diào)一遍,這不是python的問題,是初學(xué)者概念不清的問題。


當(dāng)然,這篇文章作者的原意是好的,是希望大家別搞亂編碼了,尤其是對于初學(xué)者,

同樣地,我也給出我自己的結(jié)論:

只要熟悉編碼,可以繼續(xù)放心使用?setdefaultencoding('utf-8'),

另外:用python2.x寫代碼時,只要保證全局統(tǒng)一是str類型或者unicode類型就行了,并不會出問題,出問題的其實(shí)都是因?yàn)樽约簩幋a不清楚、不熟悉導(dǎo)致的。需要注意,有些python包只處理/返回unicode類型,這個時候要根據(jù)自己的全局類型設(shè)定進(jìn)行轉(zhuǎn)化。

例如,我整個代碼都是str的,但是調(diào)用python包得到的結(jié)果是unicode的,那么將該結(jié)果轉(zhuǎn)化為str即可。

所以,該篇文章《立即停止使用 setdefaultencoding('utf-8'), 以及為什么》的真實(shí)意圖其實(shí)是,初學(xué)者都分不清str和unicode是什么區(qū)別的時候,把他們混淆在一起認(rèn)為是一個東西的初學(xué)者,最好還是不要使用setdefaultencoding('utf-8'),會把概念搞得越來越亂。

而對于已經(jīng)分清楚str和unicode的python使用者,其實(shí)對編碼已經(jīng)很清晰了,也根本不會寫出上面的print語句,放心地使用setdefaultencoding('utf-8')即可。

請看懂上面游樂園鬼屋的例子

總結(jié)

以上是生活随笔為你收集整理的评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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