如何将所有 econdings 附加到字符串

how to append all econdings to a string

我在 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""

问题是我无法创建适用于所有情况的解决方案,我该怎么办?

如果您不知道自己收到的是什么,就没有通用的好方法。

如果您愿意丢弃任何非 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.