问题:UnicodeDecodeError:’utf8’编解码器无法解码字节0x9c
我有一个套接字服务器,应该从客户端接收UTF-8有效字符。
问题是某些客户端(主要是黑客)正在通过它发送所有错误的数据。
我可以轻松地区分真正的客户端,但是我会将所有发送的数据记录到文件中,以便以后进行分析。
有时我会得到这样的œ
导致UnicodeDecodeError
错误的字符。
我需要使字符串UTF-8带有或不带有这些字符。
更新:
对于我的特殊情况,套接字服务是MTA,因此我只希望接收ASCII命令,例如:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
我将所有这些都记录在JSON中。
然后,一些没有好主意的人决定出售各种垃圾。
这就是为什么对于我的特定情况,完全可以剥离非ASCII字符。
回答 0
http://docs.python.org/howto/unicode.html#the-unicode-type
str = unicode(str, errors='replace')
要么
str = unicode(str, errors='ignore')
注意: 这将删除(忽略)有问题的字符,并返回不包含这些字符的字符串。
对我而言,这是理想的情况,因为我将其用作针对非ASCII输入的保护,这是我的应用程序所不允许的。
或者:使用codecs
模块中的open方法读取文件:
import codecs
with codecs.open(file_name, 'r', encoding='utf-8',
errors='ignore') as fdata:
回答 1
将引擎从C更改为Python确实帮了我大忙。
引擎是C:
pd.read_csv(gdp_path, sep='\t', engine='c')
‘utf-8’编解码器无法解码位置18的字节0x92:无效的起始字节
引擎是Python:
pd.read_csv(gdp_path, sep='\t', engine='python')
对我来说没有错误。
回答 2
现在,我开始使用Python 3时,这种类型的问题就冒出来了。我不知道Python 2只是在蒸腾文件编码方面的任何问题。
在上述方法都不适合我之后,我找到了关于差异以及如何找到解决方案的很好的解释。
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
但是,请阅读文章,没有一种适合所有解决方案的尺寸。
回答 3
>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ
回答 4
我有同样的问题,UnicodeDecodeError
我用这条线解决了。不知道这是否是最好的方法,但是对我有用。
str = str.decode('unicode_escape').encode('utf-8')
回答 5
首先,使用get_encoding_type来获取编码的文件类型:
import os
from chardet import detect
# get file encoding type
def get_encoding_type(file):
with open(file, 'rb') as f:
rawdata = f.read()
return detect(rawdata)['encoding']
第二,打开以下类型的文件:
open(current_file, 'r', encoding = get_encoding_type, errors='ignore')
回答 6
万一有人有同样的问题。我将Vim与YouCompleteMe一起使用,无法通过此错误消息启动ycmd,我所做的是:export LC_CTYPE="en_US.UTF-8"
,问题消失了。
回答 7
如果需要对文件进行更改但不知道文件的编码,该怎么办?如果您知道编码是ASCII兼容的,并且只想检查或修改ASCII部分,则可以使用surrogateescape错误处理程序打开文件:
with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
data = f.read()
回答 8
我已经解决了这个问题,只需添加
df = pd.read_csv(fileName,encoding='latin1')