UnicodeDecodeError:“utf8”编解码器无法解码字节 0x9c

Posted

技术标签:

【中文标题】UnicodeDecodeError:“utf8”编解码器无法解码字节 0x9c【英文标题】:UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c 【发布时间】:2012-09-10 04:42:01 【问题描述】:

我有一个套接字服务器,它应该从客户端接收 UTF-8 有效字符。

问题是一些客户端(主要是黑客)正在通过它发送所有错误类型的数据。

我可以轻松区分真正的客户,但我会将发送的所有数据记录到文件中,以便稍后进行分析。

有时我会得到像 œ 这样会导致 UnicodeDecodeError 错误的字符。

我需要能够使字符串带有或不带有这些字符的 UTF-8。


更新:

对于我的特殊情况,套接字服务是 MTA,因此我只希望接收 ASCII 命令,例如:

EHLO example.com
MAIL FROM: <john.doe@example.com>
...

我在 JSON 中记录了所有这些。

然后一些没有好心的人决定发送各种垃圾。

这就是为什么对于我的具体情况,去掉非 ASCII 字符是完全可以的。

【问题讨论】:

字符串是来自文件还是套接字?您能否发布代码示例,说明在通过套接字/文件处理程序发送字符串之前如何对字符串进行编码和解码? 我写了还是没有写到字符串通过套接字?我只是从套接字中读取字符串并将其放入字典中,然后将其发送到 JSON 中。由于这些字符,JSON 函数失败。 你能把你的问题样本数据放上来吗 【参考方案1】:

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:

【讨论】:

是的,虽然这通常是不好的做法/危险,因为你只会丢失字符。最好先判断或检测输入字符串的编码,先解码为unicode,再编码为UTF-8,例如:str.decode('cp1252').encode('utf-8') 在某些情况下,是的,您是对的,这可能会导致问题。就我而言,我并不关心它们,因为它们似乎是源自连接到我的套接字服务器的客户端的错误格式和编程的额外字符。 如果字符串的内容实际上是无效的,这个实际上会有所帮助,在我的情况下 '\xc0msterdam' 变成 u'\ufffdmsterdam' 替换 如果您因为在读取文件时遇到问题而来到这里,以二进制模式打开文件可能会有所帮助:open(file_name, "rb") 然后应用上面 cmets 中的 Ben 方法 相同的选项适用于更多,例如到“something.decode()”【参考方案2】:
>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ

【讨论】:

我一头雾水,你是怎么选择cp1252的?它对我有用,但为什么?我不知道,现在我迷路了:/。你能详细说明一下吗?非常感谢 ! :) 您能提供一个适用于所有角色的选项吗?有没有办法检测需要解码的字符,以便实现更通用的代码?我看到很多人都在看这个,我敢打赌,一些弃牌并不是我想要的选择。 如你所见,这个问题相当受欢迎。认为您可以使用更通用的解决方案来扩展您的答案? “猜编码轮盘赌”没有更通用的解决方案 结合网络搜索、运气和直觉找到了它:cp1252 是 used by default in the legacy components of Microsoft Windows in English and some other Western languages【参考方案3】:

以防万一有人遇到同样的问题。我正在使用带有YouCompleteMe 的vim,无法使用此错误消息启动ycmd,我所做的是:export LC_CTYPE="en_US.UTF-8",问题消失了。

【讨论】:

这与这个问题有什么关系? 完全一样,如果您知道 youcompleteme 的工作原理。 ycm插件是socket架构,客户端和服务端通信都是用socket,都是python模块,如果编码设置不正确无法解码数据包 我也有同样的问题。你能告诉我把export LC_CTYPE="en_US.UTF-8"放在哪里吗? @Remonn 嗨,你知道我们有 bash 的配置文件吗?放在里面。 @hylepo,我在 Windows 系统上 :)【参考方案4】:

现在我已经迁移到 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

但是,请阅读文章,没有一种万能的解决方案。

【讨论】:

链接已于 2021 年 10 月 9 日断开【参考方案5】:

我对@9​​87654321@ 有同样的问题,我用这条线解决了它。 不知道是否是最好的方法,但它对我有用。

str = str.decode('unicode_escape').encode('utf-8')

【讨论】:

【参考方案6】:

将引擎从 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')

对我来说没有错误。

【讨论】:

这实际上是一个很好的解决方案。我不知道为什么它被否决了。 如果您有一个巨大的csv 文件,这可能不是一个好主意。它可能会导致您出现OutOfMemory 错误或笔记本内核的自动重启。您应该在这种情况下设置encoding 优秀的答案。谢谢。这对我有用。我在导致问题的菱形字符内有“?”。用普通的眼睛,我有'“”,它是英寸。我做了两件事来弄清楚。 a) df = pd.read_csv('test.csv', n_rows=10000)。这在没有引擎的情况下完美运行。所以我增加了 n_rows 以确定哪一行有错误。 b) df = pd.read_csv('test.csv', engine='python') 。这有效,我使用 df.iloc[36145] 打印了错误的行,这打印了错误的记录。 这对我也有用......不确定“幕后”发生了什么,以及这在所有情况下是否都是一个不错/良好/正确的解决方案,但它对我有用; ) 虽然它对我有用,但我发现它如此不直观。如果没有人指出,我怎么会弄明白?我很想知道它是从哪里来的……【参考方案7】:

如果您需要更改文件,但不知道文件的编码,该怎么办?如果您知道编码与 ASCII 兼容并且只想检查或修改 ASCII 部分,则可以使用 surrogateescape 错误处理程序打开文件:

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

【讨论】:

这导致我的笔记本崩溃了。【参考方案8】:

第一种,使用get_encoding_type获取encode的文件类型:

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')

【讨论】:

当它返回 None 时会发生什么【参考方案9】:

此解决方案在使用拉丁美洲口音(例如“ñ”)时效果很好。

我已经通过添加解决了这个问题

df = pd.read_csv(fileName,encoding='latin1')

【讨论】:

也为我工作,但我想知道我的驱动器上的中国、希腊和俄罗斯命名媒体会发生什么。待续……【参考方案10】:

我已经用这个代码解决了这个问题

df = pd.read_csv(path, engine='python')

【讨论】:

以上是关于UnicodeDecodeError:“utf8”编解码器无法解码字节 0x9c的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节

Django:/accounts/ProfileDetails/'utf8' 处的 UnicodeDecodeError 编解码器无法解码位置 5915 中的字节 0xe1:无效的继续字节

flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方

python-使用pip安装第三方库报UnicodeDecodeError: 'utf8' codec can't decode byte 0xcb in position 7

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start