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