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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

python

python默认编码方式_关于设置python默认编码方式的问题

發(fā)布時(shí)間:2025/3/8 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python默认编码方式_关于设置python默认编码方式的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019-8-27 07:45:36

本帖最后由 傻紙 于 2019-8-27 10:02 編輯

查了一會(huì)資料得出的結(jié)論是如果你用的是python3.x,那么就最好別去設(shè)置sys.defaultencoding或者sys.stdout.encoding

記住在需要編碼的時(shí)候用encode,解碼的時(shí)候decode就可以了。。。

這個(gè)問(wèn)題貌似很復(fù)雜

首先區(qū)分一下sys.stdout.encoding和sys.defaultencoding是不一樣的

sys.defaultencoding

sys.defaultencoding是默認(rèn)的字符串轉(zhuǎn)化編碼

在python2.x版本中,字符串默認(rèn)編碼是ascii,舉例來(lái)說(shuō),

a="abc"+u"bcd"

當(dāng)連接一個(gè)ascii編碼的字節(jié)型字符串"abc"和一個(gè)unicode字符串bcd的時(shí)候,python調(diào)用"abc".decode(sys.getdefaultencoding())將abc轉(zhuǎn)換成unicode編碼,如果把"abc"替換成一個(gè)非ascii字符,編碼工作就會(huì)失敗,并提示UnicodeDecodeError。因?yàn)閍scii字符實(shí)在是太少,顯示中文都不行,所以python提供sys.setdefaultencoding允許用戶(hù)設(shè)置默認(rèn)編碼。但是在python3.x中字符串默認(rèn)使用的是unicode編碼,所以未來(lái)sys.getdefaultencoding將會(huì)被棄用。

那么問(wèn)題可能是,我用python3想把默認(rèn)編碼換成utf8,怎么辦?

2.x有方法,3.x就找不到方法了,而且很多大佬強(qiáng)烈建議不要換

參考這個(gè)問(wèn)題里的前兩個(gè)回答(尤其是第二個(gè)):

https://stackoverflow.com/questions/11741574/how-to-print-utf-8-encoded-text-to-the-console-in-python-3

sys.stdout.encoding

sys.stdout.encoding是終端輸出編碼,比方輸出到windows控制臺(tái)使用的編碼..其實(shí)print函數(shù)就是對(duì)于sys.stdout.write()的封裝,直接sys.stdout.write()也可以輸出

在python2.x里面,可以通過(guò)設(shè)置環(huán)境變量PYTHONIOENCODING=ascii把sys.stdout.encoding改成ascii編碼,但是在python3.x里面這種方法也行不通了

關(guān)于python3.0的sys.stdout.encoding可能又要分成兩個(gè)來(lái)說(shuō),一個(gè)是windows控制臺(tái)終端,一個(gè)是python的IDLE

windows控制臺(tái)

對(duì)于windows控制臺(tái),python在輸出的時(shí)候通過(guò)unicode API傳送到windows控制臺(tái),如果控制臺(tái)設(shè)置了字體支持該字符顯示,就會(huì)顯示出來(lái),如果控制臺(tái)不支持顯示,它就不顯示,但也不會(huì)報(bào)錯(cuò),而且還可以把它拷貝到它能顯示的地方。

python的IDLE

IDLE貌似就沒(méi)有windows控制臺(tái)這么智能,不支持它就報(bào)錯(cuò)。這個(gè)找不到解決辦法,但是一般都能打印的,除非你嘗試?yán)肐DLE打印某些奇怪的字符

另外,還有一個(gè)可能是重點(diǎn),python3.x默認(rèn)的sys.stdout.encoding只是一個(gè)首選,比方把sys.stdout.encoding設(shè)置成ascii輸出方式,當(dāng)碰到要輸出的內(nèi)容是unicode編碼的時(shí)候,它會(huì)自動(dòng)在sys里面某種合適的編碼,然后采用這種編碼,所以最后還是會(huì)以u(píng)nicode編碼的形式輸出。

這樣看起來(lái)是不是,在python3.x里設(shè)置sys.stdout.encoding也沒(méi)什么用

但是如果非要設(shè)置,那么可以參考https://stackoverflow.com/a/32176732/4279,最后那句話(huà)

其他的還可以參考https://blog.csdn.net/jian3x/article/details/89442748

最后看到一個(gè)有意思的例子

分別讓windows控制臺(tái)和IDLE執(zhí)行print('\U0001F44D')

IDLE會(huì)報(bào)錯(cuò),UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f44d' in position 0: Non-BMP character not supported in Tk

windows控制臺(tái)會(huì)顯示兩個(gè)框框,表示顯示不了,但是可以復(fù)制粘貼到記事本是(一個(gè)大拇指)

但試著這樣執(zhí)行一下

non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)

print('\U0001F44D'.translate(non_bmp_map))

寫(xiě)得有點(diǎn)多,都是憑自己的感覺(jué)來(lái)寫(xiě)的,編碼我覺(jué)得我還需要研究研究,很多地方可能我理解錯(cuò)了,所以最好看我帖的鏈接的原文

總結(jié)

以上是生活随笔為你收集整理的python默认编码方式_关于设置python默认编码方式的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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