为什么我们不应该在py脚本中使用sys.setdefaultencode(“utf-8”)?

  • 回答 (2)
  • 关注 (0)
  • 查看 (58)

我看到了很少的py脚本在脚本顶部使用这个。在什么情况下应该使用它?

import sys
reload(sys)
sys.setdefaultencoding("utf-8")
土豆呢土豆呢提问于
心愿回答于

根据文档:这允许您从默认的ASCII切换到其他编码,比如UTF-8,Python运行时将使用它来将字符串缓冲区解码为Unicode。

只有在Python启动时,当Python扫描环境时,这个函数才可用.。它必须在一个全系统的模块中调用,sitecustomize.py,在评估此模块之后,setdefaultencoding()函数从sys模块。

实际使用它的唯一方法是重新加载Hack,从而使属性返回。

还有,使用sys.setdefaultencoding()一直不鼓励,它已经变成了一个没有在3k。py3k的编码是硬连接到“utf-8”,更改它会引发一个错误。

萧雨牧歌潜行者回答于

TL;DR

答案是绝不可能(除非你真的知道自己在做什么)

9/10倍的解决方案可以通过正确理解编码/解码来解决。

1/10人有错误定义的地点或环境,需要设置:

PYTHONIOENCODING="UTF-8"  

在他们的环境中修复控制台打印问题。

是干什么的呢?

sys.setdefaultencoding("utf-8")(为了避免重复使用)每当Python2.x需要将Unicode()转换为str()(反之亦然)时,就会更改默认的编码/解码,并且不会给出编码。即:

str(u"\u20AC")
unicode("€")
"{}".format(u"\u20AC") 

在Python2.x中,默认编码设置为ASCII,上述示例将失败:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)

(我的控制台配置为UTF-8,所以"€" = '\xe2\x82\xac',因此在\xe2)

UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)

sys.setdefaultencoding("utf-8")将允许这些工作,但不一定适用于不使用UTF-8的人。asci的默认设置确保编码的假设不被写入代码中。

控制台

sys.setdefaultencoding("utf-8")也有一个副作用,似乎修复sys.stdout.encoding,当将字符打印到控制台时使用。Python使用用户的地区(Linux/OSX/un)*(X)或代码页(Windows)设置此值。偶尔,用户的区域设置会中断,只需要PYTHONIOENCODING若要修复控制台编码

例子:

$ export LANG=en_GB.gibberish
$ python
>>> import sys
>>> sys.stdout.encoding
'ANSI_X3.4-1968'
>>> print u"\u20AC"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)
>>> exit()

$ PYTHONIOENCODING=UTF-8 python
>>> import sys
>>> sys.stdout.encoding
'UTF-8'
>>> print u"\u20AC"
€

有什么不好的sys.setdefaultencode(“utf-8”)?

16年来,人们一直在使用Python2.x进行开发,人们的理解是默认的编码是ASCII。UnicodeError已经编写了异常处理方法来处理字符串到Unicode的转换,这些字符串被发现包含非ASCII。

def welcome_message(byte_string):
    try:
        return u"%s runs your business" % byte_string
    except UnicodeError:
        return u"%s runs your business" % unicode(byte_string,
            encoding=detect_encoding(byte_string))

print(welcome_message(u"Angstrom (Å®)".encode("latin-1"))

在设置默认编码之前,这段代码将无法解码ascii编码中的“oi”,然后输入异常处理程序来猜测编码并正确地将其转换为Unicode。印刷:Angstrom。®经营你的生意。一旦将默认编码设置为utf-8,代码将发现字节_字符串可以被解释为utf-8,因此它会损坏数据并返回以下内容:Angstrom(Ů)运行您的业务

扫码关注云+社区