Twisted中的Unicode异常

4 投票
1 回答
1290 浏览
提问于 2025-04-16 13:53

在我的生产服务器上,偶尔会出现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 个回答

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字符被记录了,并停止这样做。你可以通过将它们转换成你希望日志文件使用的编码格式来解决这个问题。

撰写回答