Python 为什么不在py脚本中使用sys.setdefaultencoding(“utf-8”)呢?
我看到很少有py脚本在脚本的顶部使用这个。在什么情况下应该使用它Python 为什么不在py脚本中使用sys.setdefaultencoding(“utf-8”)呢?,python,encoding,utf-8,python-2.x,sys,Python,Encoding,Utf 8,Python 2.x,Sys,我看到很少有py脚本在脚本的顶部使用这个。在什么情况下应该使用它 import sys reload(sys) sys.setdefaultencoding("utf-8") import sys if (sys.stdout.encoding is None): print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOEN
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
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)
根据文档:这允许您从默认ASCII切换到其他编码,如UTF-8,Python运行时在需要将字符串缓冲区解码为unicode时将使用UTF-8
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)
只有在Python启动时,当Python扫描环境时,此函数才可用。必须在系统范围的模块中调用它,sitecustomize.py
,对该模块求值后,从sys
模块中删除setdefaultencoding()
函数
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)
实际使用它的唯一方法是通过重新加载将属性带回来
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)
另外,一直不鼓励使用sys.setdefaultencoding()
,并且在py3k中它已成为一个禁忌。py3k的编码硬连接到“utf-8”,更改它会导致错误
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)
我建议一些阅读指南:
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)
所以,用同样的例子:
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)
export PYTHONIOENCODING=UTF-8
./test.py > output.txt
将工作tl;博士
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)
答案是永远不要!(除非你真的知道自己在做什么)
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)
在正确理解编码/解码的情况下,可以解决9/10次问题
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/10的人的区域设置或环境定义不正确,需要设置:
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)
PYTHONIOENCODING="UTF-8"
在他们的环境中修复控制台打印问题
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)
它有什么作用?
sys.setdefaultencoding(“utf-8”)
(贯穿以避免重复使用)更改Python 2.x需要将Unicode()转换为str()时使用的默认编码/解码(反之亦然),并且不提供编码。即:
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)
str(u"\u20AC")
unicode("€")
"{}".format(u"\u20AC")
在Python2.x中,默认编码设置为ASCII,上述示例将失败:
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)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
(我的控制台配置为UTF-8,因此“€”='\xe2\x82\xac'
,因此\xe2
出现异常)
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)
或
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)
sys.setdefaultencoding(“utf-8”)
将允许这些功能适用于me,但不一定适用于不使用utf-8的人ASCII的默认值确保编码假设不会被烘焙到代码中
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)
安慰
sys.setdefaultencoding(“utf-8”)
还有一个副作用,即在控制台打印字符时,会出现修复sys.stdout.encoding
。Python使用用户的区域设置(Linux/OSX/Un*X)或代码页(Windows)来设置此设置。有时,用户的区域设置被破坏,只需要pythoniocodeding
来修复控制台编码
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)
例如:
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)
$export LANG=en_GB.胡言乱语
$python
>>>导入系统
>>>sys.stdout.encoding
“ANSI_X3.4-1968”
>>>打印u“\u20AC”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeEncodeError:“ascii”编解码器无法对位置0中的字符u'\u20ac'进行编码:序号不在范围内(128)
>>>退出()
$PythonionEncoding=UTF-8 python
>>>导入系统
>>>sys.stdout.encoding
“UTF-8”
>>>打印u“\u20AC”
€
sys.setdefaultencoding(“utf-8”)有什么不好?
16年来,人们一直在开发Python2.x,因为他们知道默认编码是ASCIIUnicodeError
已编写异常处理方法来处理发现包含非ASCII的字符串上的字符串到Unicode的转换
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)
从
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)
在设置defaultencoding之前,此代码将无法解码ascii编码中的“Å”,然后将输入异常处理程序猜测编码并正确地将其转换为unicode。印刷:Angstrom(Å®)经营您的业务。一旦您将defaultencoding设置为utf-8,代码将发现字节字符串可以解释为utf-8,因此它将破坏数据并返回以下内容:Angstrom(Ů)运行您的业务
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)
更改应为常数的内容将对您所依赖的模块产生显著影响。最好只修复代码中进出的数据。
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)
示例问题
虽然将defaultencoding设置为UTF-8不是以下示例中的根本原因,但它显示了问题是如何被掩盖的,以及当输入编码更改时,代码是如何以不明显的方式中断的:
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)
重新加载(系统)
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)
当您重新加载一个模块时,您实际上会在运行时获得该模块的两个副本。旧模块与其他模块一样是Python对象,只要有对它的引用,它就会保持活动状态。因此,一半的对象将指向旧模块,另一半指向新模块。当您进行一些更改时,如果某个随机对象没有看到更改,您将永远看不到更改:
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)
(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>
(这是IPython shell)
在[1]中:导入系统
在[2]中:sys.stdout
出[2]:
在[3]中:重新加载(系统)
在[4]中:sys.stdout
出[4]:
在[11]中:导入IPython.terminal
在[14]中:IPython.terminal.interactiveshell.sys.stdout
出[14]:
sys.setdefaultencoding()
property
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)
。现在,utf-8
是地球上最健全的编码(向后兼容ASCII和所有编码),转换现在“正常工作”有什么可能出错?
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)
嗯,什么都行。这就是危险所在。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)
- 可能有一些代码依赖于为非ASCII输入抛出的
,或者使用错误处理程序进行代码转换,这会产生意外的结果。而且由于所有代码都是使用默认设置测试的,因此您在这里严格处于“不受支持”的范围内,并且没有人向您保证他们的代码将如何运行UnicodeError
- 如果不是系统上的所有设备都使用UTF-8,则转码可能会产生意外或不可用的结果。(请记住,程序必须在客户的设备上为客户工作。)
- 再说一次,最糟糕的事情是你永远不会知道b