我在python 2.5中使用所有语言和编码处理文件的系统,我想记录一些东西,而且我对非标准字符并不感兴趣,我愿意只使用ascii字符到日志,但我不时收到错误,如。
<type 'tuple'>: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'Create project: 2016 May European Tour: There\u2019s Still Time to Buy Tickets!', 45, 46, 'ordinal not in range(128)'), <traceback object at 0x105b84908>)
这是我尝试的代码的一些示例:
这大多数时间都有效,并不总是
self.__log += data.decode('utf-8', 'ignore').encode("utf-8")
这次失败了,但是之前的一些工作没有成功
self.__log += data.encode('ascii', 'ignore')
这适用于其他一些案例。
self.__log += data.decode('utf-8', 'replace')
现在正在将日志定义为
self.__log = ""
但我也试过
self.__log = u""
问题在于我无法创建适用于所有情况的解决方案,我该怎么办?
答案 0 :(得分:2)
如果你不知道你收到了什么,那就没有好的和普遍的方式了。
如果您对丢弃任何非ascii并且在数据不是ascii时严重损坏数据感到满意,您可以尝试这样的事情:
def forceAscii(s):
if isinstance(s, unicode):
return unicode(s.encode('ascii', 'replace'))
elif isinstance(s, basestring):
return s.decode('ascii', 'replace').encode('ascii', 'replace')
else:
raise ValueError('Expected a string, got a %r' % type(s))
这将为您提供一个Unicode字符串,该字符串仅包含ascii字符,给定任何Unicode或字节字符串。无法强制转换为ascii的字符将替换为“?”标记。
请注意,某些编码最终会导致某些字符严重损坏,例如映射到不可打印的ascii字符,如\x00
。