扭曲的Unicode异常

时间:2011-03-17 13:56:07

标签: python twisted

在我的生产服务器上,我定期发生unicode错误但不在我的桌面上。它出现在日志中:

2011-03-17 13:14:53+0000 [GameProtocol,941,95.78.43.17] <unicode instance at 0x9e304a0 with str error:
     Traceback (most recent call last):
      File "/usr/local/lib/python2.6/dist-packages/twisted/python/reflect.py", line 546, in _safeFormat
        return formatter(o)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-26: ordinal not in range(128)
    >

它不会影响应用程序中的任何逻辑,但它在日志中很烦人。

服务器在Ubuntu 10.10 Server,Python 2.6.5,Twisted 10.2.0下运行。

桌面是Ubuntu 10.10 Desktop,Python 2.6.5,Twisted 10.2.0。

区域设置是相同的:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

会出现什么问题?

1 个答案:

答案 0 :(得分:5)

]使用Twisted日志系统记录unicode是不安全的。这是产生您所看到的异常的最小示例:

Python 2.6.4 (r264:75706, Dec  7 2009, 18:43:55)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from twisted.python import log
>>> import sys
>>> log.startLogging(sys.stdout)
2011-03-17 11:03:47-0400 [-] Log opened.
>>> log.msg(u'\N{SNOWMAN}')
2011-03-17 11:03:53-0400 [-] <unicode instance at 140508177816384 with str error Traceback (most recent call last):
      File "/usr/lib/python2.6/dist-packages/twisted/python/reflect.py", line 560, in safe_str
        return str(o)
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2603' in position 0: ordinal not in range(128)
    >
>>> 

所以你需要找出正在记录的unicode并停止这样做,可能是以你想要的日志文件编码方式对其进行编码。