/* Convert the encoding to a normalized Python string: all
characters are converted to lower case, spaces and hyphens are
replaced with underscores. */
import sys, codecs
# somewhere in the function you need it or global main():
sys.stdout = codecs.open('/dev/stdout', encoding='utf-8', mode='w', errors='strict')
首先,},但不能叫{}。在
ISO-8859-1
不是有效的编码声明。你想要iso-8859-1
。如果您看一下the docs,您可以将其称为latin_1
、iso-8859-1
、iso8859-1
、8859
、cp819
、latin
、latin1
、或{看起来} 到{a3}到^{} ,则可以看到以下注释:
codecs.lookup
向后弯曲以接受错误的输入,包括执行不区分大小写的查找。如果跟踪^{但是源文件解码并没有经过相同的编解码器查找过程。因为它发生在编译时而不是运行时,所以没有理由这么做。(无论如何,他会说“虽然医生说这是错误的,但它似乎起作用了……那么为什么它不能完全起作用?”一开始就有点傻。)
为了演示,如果我创建两个拉丁语-1文件:
在坏代码.py公司名称:
^{pr2}$在好代码.py公司名称:
第一个失败了,第二个成功了。在
现在,为什么它在控制台时“工作”,而在管道传输时引发异常?在
好吧,当您打印到Windows控制台或unixtty时,Python有一些代码可以尝试猜测要使用的正确编码。(我不知道在Windows上会发生什么;据我所知,它甚至可能使用UTF-16输出。)当您不打印到控制台/TTY时,它不能这样做,所以您必须显式地指定编码。在
您可以通过查看}来了解发生了什么。以下是我在Mac电脑上看到的不同情况:
sys.stdout.isatty()
、sys.stdout.encoding
、和{True, UTF-8, ascii, Vérifier
True, UTF-8, utf-8, Vérifier
False, None, ascii, UnicodeEncodeError
False, UTF-8, utf-8, Vérifier
如果
isatty()
,encoding
将是TTY的适当编码;否则,encoding
将是默认值,在2.x中是None
(意思是ascii
),并且(我想-我必须检查代码)基于3.x中的getdefaultencoding()
的内容。这意味着如果您试图打印Unicode,而stdout
不是2.x中的TTY,它将尝试将其编码为ascii
,strict
,如果您有非ASCII字符,则将失败。在如果您不知何故知道要使用哪个编解码器,则可以通过检查})来手动处理,而不是尝试打印Unicode。(如果你知道你想要什么样的编解码器,即使在3.x版本中也可以这么做,如果你想生成,比如说,Windows-1252文件,那么默认为UTF-8也没有太大帮助…)
isatty()
并对该编解码器进行编码(如果愿意,甚至可以选择ascii
,ignore
而不是{这里的区别实际上与拉丁语-1无关。试试这个:
在无代码.py公司名称:
对于我的Mac终端,我将Unicode字符串编码为UTF-8,并(显然)将Windows-1252编码到windowscmd窗口,但重定向到文件时出现异常。在
因为我在这里寻找“不要太聪明”切换到python的print()并且答案提供了只读变量的提示,下面是“让python相信stdout可以处理utf-8”的片段:
现在,python不关心它是tty、tee(1)、文件重定向还是cat(1)。在
相关问题 更多 >
编程相关推荐