Why should we NOT use sys.setdefaultencoding(“utf-8”) in a py script?
我在脚本顶部看到过一些使用这个的py脚本。在什么情况下应该使用它?
1 2 3 | import sys reload(sys) sys.setdefaultencoding("utf-8") |
在文档的每:这允许你切换到其他从默认的ASCII编码的UTF - 8等,其中将使用Python运行时,它已对解码缓冲区到Unicode字符串。
这仅仅是一个Python函数可用的启动时间,当Python环境扫描。它一直被称为在全系统模块,该模块已
唯一的办法是重新使用它,实际上是带来了与黑客的属性功能。
另外,使用
我是一suggest分读:
- blog.ianbicking.org illusive-setdefaultencoding.html http:/ /
- http://///200401 nedbatchelder.com博客从印刷_ _ _ python.html Unicode
- www.diveintopython3.net http:/ / / strings.html #一环对其中的所有规则
- boodebr.org http:/ / / /主/全关于Python Python的Unicode和
- 2010年blog.notdot.net http:////07/要选择权在Python
TL DR;
答案是不!组分(除非你真的知道什么是为你做的(亚)<>
9/10的解决方案可以与时间分辨的正确理解,编码/解码。
1/10的人或有一个定义的incorrectly现场环境和需要设置:
1 | PYTHONIOENCODING="UTF-8" |
在他们的环境修复控制台到印刷的问题。
它的是什么?
<>></
1 2 3 | str(u"\u20AC") unicode("€") "{}".format(u"\u20AC") |
在Python 2.0,默认被设置为ASCII编码和故障实例将上述资料:
1 | UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128) |
(我是configured控制台的操作系统
或
1 | UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128) |
<>></
控制台
<>></
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ 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.setdefaultencoding(>与<走"UTF-8"></)走吗?
人们已对Python 2.0是16年的发展,在了解的默认编码是ASCII码。异常处理方法
从anonbadger.wordpress.com https://///06/16年。setdefaultencoding为什么会断码/
1 2 3 4 5 6 7 8 | 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")) |
Previous to setting defaultencoding this code would be unable to decode the"?" in the ascii encoding and then would enter the exception handler to guess the encoding and properly turn it into unicode. Printing: Angstrom (??) runs your business. Once you’ve set the defaultencoding to utf-8 the code will find that the byte_string can be interpreted as utf-8 and so it will mangle the data and return this instead: Angstrom (?) runs your business.
你应该不断变化的影响将取决于你有戏剧在在线模块。这是更好的,只是在固定的日期到了,你的代码和输出。
例子的问题
在设置defaultencoding到UTF - 8,是不是因为在根以下的例子,它是如何显示的问题是如何与编码的变化,当输入的代码,在一个不太明显的断裂方式:unicodedecodeerror":"UTF8编解码器不能解码的字节的位置:无效的启动在3131 0x80字节
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/env python #-*- coding: utf-8 -*- u = u'mo?ambique' print u.encode("utf-8") print u chmod +x test.py ./test.py mo?ambique mo?ambique ./test.py > output.txt Traceback (most recent call last): File"./test.py", line 5, in <module> print u UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 2: ordinal not in range(128) |
在线sdtout壳厂,送不到,这是一个操作系统(workaround,写标准输出。
我用其他的方法,这是不sys.stdout.encoding运行是不确定,如果需要的话,或在别人的口,pythonioencoding = UTF - 8的第一写入到标准输出。
1 2 3 4 | import sys if (sys.stdout.encoding is None): print >> sys.stderr,"please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." exit(1) |
操作系统,用相同的例子:
1 2 | export PYTHONIOENCODING=UTF-8 ./test.py > output.txt |
将工作
第一个危险在于
reload(sys) 。当您重新加载一个模块时,实际上会在运行时获得该模块的两个副本。旧模块和其他所有模块一样是一个Python对象,只要有对它的引用,它就保持活动。因此,一半的对象将指向旧模块,另一半指向新模块。当你做出一些改变时,当某个随机对象没有看到改变时,你将永远看不到它的到来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17(This is IPython shell)
In [1]: import sys
In [2]: sys.stdout
Out[2]: <colorama.ansitowin32.StreamWrapper at 0x3a2aac8>
In [3]: reload(sys)
<module 'sys' (built-in)>
In [4]: sys.stdout
Out[4]: <open file '<stdout>', mode 'w' at 0x00000000022E20C0>
In [11]: import IPython.terminal
In [14]: IPython.terminal.interactiveshell.sys.stdout
Out[14]: <colorama.ansitowin32.StreamWrapper at 0x3a9aac8>现在,
sys.setdefaultencoding() 合适了它所影响的只是隐含的转换
str<->unicode 。现在,utf-8 是地球上最健全的编码(向后兼容ASCII和all),转换现在"正常工作",有什么可能出错?好吧,随便什么。这就是危险。
- 可能有一些代码依赖于为非ASCII输入而抛出的
UnicodeError ,或者使用错误处理程序进行转码,现在会产生意外的结果。而且由于所有代码都是用默认设置测试的,所以您严格地处于"不受支持"的区域,没有人向您保证它们的代码将如何工作。 - 如果不是系统上的所有内容都使用UTF-8,代码转换可能会产生意外或不可用的结果,因为python 2实际上有多个独立的"默认字符串编码"。(记住,程序必须在客户的设备上为客户工作。)
- 同样,最糟糕的是,你永远不会知道,因为转换是隐式的——你不知道它何时何地发生。(Python禅,可安2号,你好!)你永远不会知道为什么(如果)你的代码在一个系统上工作而在另一个系统上中断。(或者更好的是,在IDE中工作,在控制台中休息。)
- 可能有一些代码依赖于为非ASCII输入而抛出的