簡體   English   中英

python'ascii'在打印語句中編碼問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM