繁体   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