ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有时我会得到类似 œ 的字符,它们会导致 UnicodeDecodeError 错误。

我需要能够使用或不使用这些字符来制作字符串 UTF-8。

更新:

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

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

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

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

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

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

M
Max Ghenis

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") 然后应用上面评论中 Ben 的方法
如何导入 unicode
D
Doğuş

将引擎从 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] 打印了错误的行,这打印了错误的记录。
这也对我有用......不确定“幕后”发生了什么,以及这是否在所有情况下都是一个不错/好的/适当的解决方案,但它对我有用;)
虽然它对我有用,但我觉得它很不直观。如果没有人指出,我怎么会弄明白?我很想知道它是从哪里来的……
J
James McCormac

既然我已经迁移到 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 日起,该链接已断开
截至 2022-02-12 使用 Python 3.8 我没有问题。
I
Ignacio Vazquez-Abrams
>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ

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

首先,使用 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')

当它返回 None 时会发生什么
m
maiky_forrester

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

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

C
Community

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

我只是通过添加解决了这个问题

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

也为我工作,但我想知道我的驱动器上的中国、希腊和俄罗斯命名媒体会发生什么。未完待续...
S
Sathiamoorthy

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

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

h
http8086

以防万一有人遇到同样的问题。我正在使用带有 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 系统上:)
K
Krisztián Balla

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

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

这导致我的笔记本崩溃。