Python UTF8、Unicode和二进制数据读取故障

Python UTF8、Unicode和二进制数据读取故障,python,unicode,utf-8,Python,Unicode,Utf 8,我一直在用脚本读取文件,提取和索引一些字符串。除了文件编码的一个问题外,一切都很顺利 我将尝试恢复: 我的脚本从文件中读取数据块,将这些数据块转换为小写,并使用Unicode数据进行规范化以删除替换特殊字符(ç、á、é、ã等)。规范化: unicodedata.normalize("NFKD",chunk.decode("utf8","ignore")).encode("ascii","ignore").lower() 在本例中,字符串“Olá,como vai vocêVamos caçar

我一直在用脚本读取文件,提取和索引一些字符串。除了文件编码的一个问题外,一切都很顺利

我将尝试恢复:

我的脚本从文件中读取数据块,将这些数据块转换为小写,并使用Unicode数据进行规范化以删除替换特殊字符(ç、á、é、ã等)。规范化:

unicodedata.normalize("NFKD",chunk.decode("utf8","ignore")).encode("ascii","ignore").lower()
在本例中,字符串“Olá,como vai vocêVamos caçar?”将导致“Ola,como vai voc?Vamos cacar?”它可以很好地处理UTF8编码的文本文件,但在尝试从二进制文件(如MS.doc文件)检索字符串时失败。使用上面相同的代码,将返回字符串“Ol,como vai voc?Vamos caar?”

我已经使用unicode转义码成功地使它与MS.doc文件一起工作(但在UTF8文件中它将失败)

经过20多个小时的研究,我还没有办法让我的脚本在这两种情况下运行


不幸的是,我不能使用外部模块。

您需要参数化脚本。您应该将编码指定为您调用它的参数。如果已将文件名指定为参数,则如下所示:

$ python your_script.py input-file.txt utf8
input_file, encoding = sys.argv[1:]
请阅读如下参数:

$ python your_script.py input-file.txt utf8
input_file, encoding = sys.argv[1:]
然后将编码混乱行更改为:

unicodedata.normalize("NFKD", chunk.decode(encoding, "ignore")).encode("ascii", "ignore").lower()

也许有一种方法可以通过其他方式猜测编码(例如,如果一种类型的所有文件都以“.doc”结尾),那么您可以跳过命令行参数。

在我看来,在调用
unicodedata.normalize
之前,您做了太多的工作。你能在做其他事情之前先做标准化吗?这将有望为编码/解码工作生成一组一致的数据。您的“二进制文件(如MS.doc文件)中的字符串”是否始终是UTF-8编码的?如果没有,则需要使用不同的编码方案对其进行解码。好了,没办法了。因此,您的代码必须知道每个输入的编码(例如,通过了解其源和该源的编码。)@Austinastings在解码之前进行规范化是没有意义的。你不能对字节序列进行unicode标准化。也许不能。但是,区块同时被解码和编码。我是说也许编码应该迟一点来。我认为正在发生的是,到ascii的转换正在删除不可转换的字符(errors=“ignore”),然后规范化程序才能将它们转换为basechar+修改标记。但确实如此。仔细看括号:首先是结果上的
decode()
,然后是
normalise()
,然后是
encode()
(最后是
lower()
)。这是一个很长、很难理解的一行代码…而且,这将使测试不同的编码变得更容易–正如您对问题的评论所表明的,
unicode escape
可能不是.doc文件的正确选择。