当我试图在开发服务器上打印unicode字符串时,它可以正常工作,但生产服务器会引发异常。在
File "/home/user/twistedapp/server.py", line 97, in stringReceived
print "sent:" + json
File "/usr/lib/python2.6/dist-packages/twisted/python/log.py", line 555, in write
d = (self.buf + data).split('\n')
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 28: ordinal not in range(128)
实际上,它是twisted应用程序,并打印到日志文件。在
字符串的repr()是相同的。区域设置为en_美国UTF-8。在
我需要检查哪些配置才能使它在两个服务器上工作相同吗?在
Unicode字符串的
print
依赖于sys.stdout
(进程的标准输出)具有正确的.encoding
属性,Python可以使用该属性将Unicode字符串编码为字节字符串以执行所需的打印,并且该设置取决于操作系统的设置方式,标准输出指向何处,等等。在如果没有这样的属性,则使用默认编码的
ascii
,并且,正如您所看到的,它通常不能提供所需的结果;-)。在你可以检查
getattr(sys.stdout, 'encoding', None)
看看编码是否在那里(如果是,你可以祈祷它是正确的。。。或者,可以尝试一些特定于平台的技巧来猜测要检查的正确系统编码;-)。如果不是,一般来说,没有可靠的或跨平台的方法来猜测它可能是什么。你可以试试'utf8'
,这是一种在很多情况下都能工作的通用编码(肯定比ascii
做的还要多;-),但这确实是一个轮盘赌的旋转。在为了提高可靠性,您的程序应该有自己的配置文件来告诉它要使用什么输出编码(如果没有另外指定的话,可以使用
'utf8'
作为默认值)。在为了更好地进行编码
而是
^{pr2}$实际上,如果你宁愿有不完整的输出而不是崩溃
(它只是跳过不可编码字符),或者,通常更好
(对不可编码字符使用问号占位符)。在
Twisted的内置日志观察程序不支持Unicode。请参阅http://twistedmatrix.com/trac/ticket/989以获取添加对此的支持的进度,或者查看您可以做些什么来帮助您。在
除非#989得到了解决,并且应用程序部署在Twisted版本中,否则不要记录unicode。只记录
str
。在相关问题 更多 >
编程相关推荐