Soi*_*oid 6 python unicode twisted
当我尝试在我的开发服务器上打印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)
Run Code Online (Sandbox Code Playgroud)
实际上它是扭曲的应用程序并打印转发到日志文件.
字符串的repr()是相同的.区域设置设置为en_US.UTF-8.
我需要检查哪些配置才能使它在两台服务器上都能正常工作?
printUnicode字符串依赖于sys.stdout(进程的标准输出)具有正确的.encoding属性,Python可以使用该属性将unicode字符串编码为字节字符串以执行所需的打印 - 该设置取决于操作系统的设置方式,其中标准输出指向,等等.
如果没有这样的属性,ascii则使用默认编码,并且如您所见,它通常不会提供所需的结果;-).
您可以检查getattr(sys.stdout, 'encoding', None)编码是否存在(如果是,您可以保持手指交叉,这是正确的......或者,也许,尝试一些特定于平台的技巧来猜测正确的系统编码来检查; - ).如果不是这样,一般来说,没有可靠的或跨平台的方式来猜测它可能是什么.你可以试试'utf8',在很多情况下都可以使用的通用编码(肯定比ascii这更多;-),但它确实是轮盘赌的一个旋转.
为了获得更高的可靠性,您的程序应该有自己的配置文件来告诉它使用哪种输出编码('utf8'如果没有另外指定,可以使用默认值).
对于可移植性而言,执行自己的编码也是更好的,也就是说,不是
print someunicode
Run Code Online (Sandbox Code Playgroud)
反而
print someunicode.encode(thecodec)
Run Code Online (Sandbox Code Playgroud)
实际上,如果你的输出不完整而不是崩溃,
print someunicode.encode(thecodec, 'ignore')
Run Code Online (Sandbox Code Playgroud)
(它只是跳过不可编码的字符),或者,通常更好,
print someunicode.encode(thecodec, 'replace')
Run Code Online (Sandbox Code Playgroud)
(对于不可编码的字符使用问号占位符).
Twisted 的内置日志观察器不支持 Unicode。请参阅http://twistedmatrix.com/trac/ticket/989了解添加对此支持的进度,或者了解您可以提供哪些帮助。
在 #989 得到解决并且您的应用程序部署在 Twisted 版本中得到修复之前,请勿记录 unicode。仅记录str.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |