在我的生产服务器上,我定期发生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)
>
Run Code Online (Sandbox Code Playgroud)
它不会影响应用程序中的任何逻辑,但它在日志中很烦人.
该服务器在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
Run Code Online (Sandbox Code Playgroud)
会出现什么问题?
使用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)
>
>>>
Run Code Online (Sandbox Code Playgroud)
因此,您需要找出正在记录的unicode并停止执行该操作,可能需要以您希望对日志文件进行编码的方式对其进行编码.