UnicodeDecodeError:'utf8'编解码器无法解码字节0x9c
我有一个应该从客户端接收UTF-8有效字符的套接字服务器。
问题是一些客户端(主要是黑客)正在发送所有错误的数据。
我可以很容易区分真正的客户端,但是我正在logging所有发送的数据,以便日后分析。
有时我会得到像这样的字符œ
导致UnicodeDecodeError
错误。
我需要能够使stringUTF-8有或没有这些字符。
更新:
对于我的特殊情况,套接字服务是MTA,因此我只希望接收ASCII命令,例如:
EHLO example.com MAIL FROM: <john.doe@example.com> ...
我在JSON中logging所有这一切。
然后一些没有好意的人决定出售各种垃圾。
这就是为什么对于我的具体情况,剥离非ASCII字符是完全正确的。
http://docs.python.org/howto/unicode.html#the-unicode-type
str = unicode(str, errors='replace')
要么
str = unicode(str, errors='ignore')
注意:此解决scheme将删除(忽略)返回没有它们的string。 只有在你需要剥离它们时才使用它。
或者,使用codecs
模块中的open方法读取文件:
import codecs with codecs.open(file_name, "r",encoding='utf-8', errors='ignore') as fdata:
>>> '\x9c'.decode('cp1252') u'\u0153' >>> print '\x9c'.decode('cp1252') œ
这种types的问题现在已经转移到了Python 3.我不知道Python 2只是简单地解决了文件编码问题。
我发现这个差异的很好的解释,以及如何find一个解决scheme后,以上都没有为我工作。
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
简而言之,要使Python 3与Python 2的行为尽可能相似:
with open(filename, encoding="latin-1") as datafile: # work on datafile here
但是,阅读文章,没有一个适合所有的解决scheme。
我有UnicodeDecodeError
相同的问题,我解决了这一行。 不知道是否是最好的方法,但它为我工作。
str = str.decode('unicode_escape').encode('utf-8')
以防万一有人有同样的问题。 我用YouCompleteMe使用vim,未能启动ycmd与此错误消息,我所做的是: export LC_CTYPE="en_US.UTF-8"
,问题已经消失。