[英]Python 'ascii' encode problems in print statement
系統:Linux上的python 3.4.2。
我在django應用程序上擔心(無關),並且遇到了引發的問題
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
當調用打印 (!)時。 經過一番挖掘之后,我發現我應該檢查一下
>>> sys.getdefaultencoding()
'utf-8'
但是確實如預期,utf8。 我還注意到,當與unicode字符串一起使用時, os.path.exists
引發相同的異常。 所以我檢查了
>>> sys.getfilesystemencoding()
'ascii'
當我使用LANG=en_US.UTF-8
,問題消失了。 我現在了解為什么os.path.exists
對此存在問題。 但是我絕對不知道為什么print
語句受文件系統設置影響。 我缺少第三種設置嗎? 還是只是假設LANG
環境對所有事物都值得信賴?
另外...我在這里沒有理由。 LANG
不會告訴您文件名支持哪種編碼。 與此無關。 它是針對當前環境(而非文件系統)單獨設置的。 為什么python在文件系統文件名中使用此設置? 它使應用程序非常脆弱,因為在未將LANG
設置或設置為C
的環境中運行時,所有文件操作都會中斷(這並不罕見,尤其是當Web應用程序以root用戶運行或專門為守護程序創建的新用戶運行時) )。
測試代碼(無需實際的unicode輸入即可避免終端編碼陷阱):
x=b'\xc4\x8c\xc5\xbd'
y=x.decode('utf-8')
print(y)
題:
LANG
設置? print
受到影響? LANG
用於確定您的語言環境 ; 如果您未設置特定的LC_
變量,則將LANG
變量用作默認變量。
文件系統編碼由LC_CTYPE
變量確定,但如果未專門設置該變量,則改用LANG
環境變量。
打印使用sys.stdout
,這是使用終端使用的編解碼器配置的文本文件。 您的終端設置也是特定於語言環境的; 您的LANG
變量應真正反映您的終端設置的語言環境。 如果是UTF-8,則需要確保您的LANG
變量能反映出這一點。 sys.stdout
使用locale.getpreferredencoding(False)
(就像在沒有顯式編碼集的情況下打開的所有文本流一樣),在POSIX系統上也將使用LC_CTYPE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.