Python 3.x 与Python和外语相关的编码问题

Python 3.x 与Python和外语相关的编码问题,python-3.x,unicode,encoding,byte,decoding,Python 3.x,Unicode,Encoding,Byte,Decoding,这是我在编码和解码文本时面临的一个问题 我试图编写一个代码,在文件中查找“字符串”或“字节”,并返回文件的路径 目前,由于我打开的文件编码为“windows-1252”或“cp-1252”,因此我一直在尝试: 1.将我的字符串编码为与文件编码相对应的字节 2.匹配该文件并获取该文件的路径 我有一个文件,比如“f”,它的编码是“windows-1252”或“cp-1252”。它包括一个中文文本:[跑在线 的農場]' with open(os.path.join(root, filename), m

这是我在编码和解码文本时面临的一个问题

我试图编写一个代码,在文件中查找“字符串”或“字节”,并返回文件的路径

目前,由于我打开的文件编码为“windows-1252”或“cp-1252”,因此我一直在尝试: 1.将我的字符串编码为与文件编码相对应的字节 2.匹配该文件并获取该文件的路径

我有一个文件,比如“f”,它的编码是“windows-1252”或“cp-1252”。它包括一个中文文本:
[跑在线 的農場]'

with open(os.path.join(root, filename), mode='rb') as f:
    text = f.read()
    print(encoding(text)) # encoding() is a separate function that I wrote that returns the encoding of the file
    print(text)
如您所见,
[跑在线 的農場]
[\xb6]在线\xb9A\xb3\xf5]

然而,有趣的是,如果我真的将字符串转换成字节,我会得到:

enter_text = '[跑Online農場]'
print(bytes(enter_text, 'cp1252'))
我得到:

StaticText   [¶]Online¹A³õ]   €?‹  Œ  î...
我不知道该如何“翻译”
[跑在线 的農場]'
进入
'[^3]在线ªAõ]'
。回答这个问题也可以解决问题

我应该如何正确地“编码”中/外字符,使其与Python返回的“rb”字节相匹配


谢谢!

您的
编码功能错误:文件的编解码器可能是CP950,但肯定不是CP1252

注意:猜测给定字节字符串的编码总是近似值。 没有确定编码的安全方法

如果您有一个字节字符串,如

b'[\xb6]Online\xb9A\xb3\xf5]'
你知道它必须翻译成

然后,你可以尝试和一些编解码器的错误

我是用搜索中文编解码器的

当您使用CP-1252(Latin-1的Windows版本)时,您会得到mojibake:

>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp1252')
'[¶]Online¹A³õ]'
使用CP-950(繁体中文的Windows代码页)时,您将获得预期的输出:

>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp950')
'[跑Online農場]'

所以:使用CP-950读取文件。

我的第一个猜测是数据是用GBK编码的,但是
b'[\xb6]Online\xb9A\xb3\xf5]'。decode('GBK')
返回
'[禲在线 的笰初]'
,它正确地显示了拉丁和中文字符的分布,但中文字符的分布不正确。可能还有另一种类似于GBK的编码……你的问题中有很多,很多已经得到了回答。但最紧张的是“外国字符”。英语中的字母数字字符和ASCII或“ANSI”中的其他字符远远多于英语。Pro提示:始终包含编码。此外,
print
具有隐式编码(取决于操作系统),并且在Windows控制台上通常不支持完整的unicode范围,因此您的错误。请写入文件,或查看有关在Windows中打印unicode字符串的信息(已经有许多问题和答案)@GiacomoCatenazzi您的评论适用于许多“编码错误”POST,但不是真正的POST。OP已经在读取文件并显式指定编码。UnicodeEncodeError不是来自
print()
,而是来自对
bytes()的调用
使用了错误的编解码器。OP显然非常了解编码;他们的错误主要在于信任
编码
函数,该函数猜测错误。感谢您的评论!作为说明,我使用chardet库中的
UniversalDetector来“猜测”我导入Python用于工作的文本的编码。我发现了正如@lenz所注意到的,汉字是用“cp950”编码的,但其他非中文的文本无法解码。我相信剩下的唯一任务就是找到一个代码“过滤”出没有用cp950编码的文本,或者找到另一种解决此问题的方法。感谢您为我找到正确的编解码器!我衷心感谢您吃了它。我只是想说,如果我使用
.decode('cp950')
,我会得到一个
UnicodeDecodeError:'cp950'编解码器无法解码位置37:非法多字节序列
中的字节0x80。我们很快就可以解决这个问题了;您建议如何解决这个问题?(对于非中文文本,我得到了
UnicodeDecodeError
)这个问题没有一般性的答案。也许你可以(通过反复试验)找到另一种对所有文本都有效的编码,但也有可能你的文件有混合编码,即某些部分(行?)使用与其他库不同的编码。这是(注意:该库也获得了您的
)[跑在线 的農場]'损坏示例)。你需要仔细分析你的数据——如果你不能修复源代码。BTW,如果这个答案帮助你,考虑一下投票和/或接受它(见向上的三角形和在我的帖子左边的检查标记)。这就是人们如何在堆栈溢出上说“谢谢”的意思。
记录声誉低于15的人所投的票,但不改变公开显示的帖子分数。
:c
b'[\xb6]Online\xb9A\xb3\xf5]'
'[跑Online農場]'
>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp1252')
'[¶]Online¹A³õ]'
>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp950')
'[跑Online農場]'