当前位置: 首页 > 知识库问答 >
问题:

检测错误编码的UTF-8文本文件中的编码

甘祺
2023-03-14

我有一个编码问题。

我有数百万个文本文件需要为语言数据科学项目进行解析。每个文本文件都编码为UTF-8,但我刚刚发现其中一些源文件的编码不正确。

例如我有一个中文文本文件,编码为UTF-8,但文件中的文本如下所示:

Subject: »Ø¸´: ÎÒÉý¼¶µ½

当我使用Python检测此中文文本文件的编码时:

Chardet告诉我文件编码为UTF-8:

with open(path,'rb') as f:
    data = ""
    data = f.read()
    encoding=chardet.detect(data)['encoding']

UnicodeDammit还告诉我该文件编码为UTF-8:

with open(path,'rb') as f:
    data = ""
    data = f.read()
    encoding= UnicodeDammit(data).original_encoding

同时,我知道这不是UTF-8,而是GB2312中文编码。如果我在记事本中打开这个文件,它也会被检测为UTF-8,所有汉字都会显示为乱码。只有当我手动将记事本中的编码切换到GB2312时,我才能获得正确的文本:

Subject: 禄脴赂麓: 脦脪脡媒录露碌陆

我有很多这样的文件,用各种语言。

有没有一种方法可以检测这些编码不良的UTF-8文件中的编码?

示例文本文件可在此处下载:https://gofile.io/d/qMcgkt

共有2个答案

宗政洋
2023-03-14

您无法获得链接示例的明确编码。txt文件连接了两种不同的编码:

path = r'D:\Downloads\example.txt'
with open(path,'rb') as f:
    data = f.read()

# double mojibake
print( data[:37].decode('utf-8').encode('latin1').decode('gb2312') )

# Chinese
print( data[37:].decode('gb2312') )

结果粘贴到谷歌翻译给出

Subject: Re: I upgraded to

The orange version of the orange version, should be corrected

不幸的是,SO认为结果中的中文文本是垃圾邮件,所以我无法将其嵌入此处…

正文不能包含“”。

这似乎是垃圾邮件。如果您认为我们犯了错误,请在meta中发表帖子。

编辑:print(data[: 37]. decode('gb18030'))返回

Subject: 禄脴赂麓: 脦脪脡媒录露碌陆

Google Translate然后给出主题:Lulululu:lululululu Lulu,作为后一个字符串的英语等价物
无论如何,上述主题:Re:I Upgrade to(或Mark Tolonen建议的Re:I Upgration to)看起来比这更有意义…

施洛城
2023-03-14

最后,我终于明白了。使用CharsetNormalizerMatches似乎可以正常检测编码。无论如何,这就是我实现它的方式,它就像一个魔咒,正确地检测到所讨论的文件的gb18030编码:

from charset_normalizer import CharsetNormalizerMatches as CnM
encoding = CnM.from_path(path).best().first().encoding

注意:有人向我暗示了答案,他建议使用CharsetNormalizerMatches,但后来在这里删除了他的帖子。太糟糕了,我很乐意把这归功于他/她。

 类似资料:
  • 我有字节数组,它放在InputStreamReader中,用它做一些操作。 JVM有默认的cp1252编码,但是我转换成字节数组的文件有utf-8编码。此外,这个文件有德语umlauts。当我把字节数组放在InputStreamReader中时,java会将元音解码为错误的符号。例如,ürepression为。我试着把“utf-8”和charset.forname(“utf-8”).newdeco

  • 这是我导出查询的VBA代码: docmd.transfertext acExportDelim,“miniFlow”,“qry01_cz_test”,“c:\test_cz.txt”,“no docmd.transfertext acExportDelim,”miniFlow“,”qry01_sk_test“,”c:\test_sk.txt“,”no 我还试图修改它,添加65001作为编码参数,结

  • 问题内容: 我有一个包含unicode字符串的词典列表。 可以将字典列表写入CSV文件。 我希望CSV文件以UTF8编码。 该模块无法处理将unicode字符串转换为UTF8的操作。 该模块文档具有的一切转换为UTF-8的例子: 它也有一个类。 但是…我该如何处理这些?他们是否不必将自己插入其中,以捕获反汇编的字典并对其进行编码,然后再将其写入文件中?我不明白 问题答案: 更新 :第三方unico

  • 问题内容: 我有一个脚本,将多个文件合并为一个脚本,当其中一个文件具有UTF8编码时,它就会中断。我认为读取文件时应该使用该函数,但是我不知道如何分辨需要解码的内容。 我的代码基本上是: 当前,在UTF8文件的开头,它将在输出中添加以下字符: 问题答案: 尝试使用该功能。此函数将检查您的字符串并尝试“猜测”其编码是什么。然后,您可以根据需要进行转换。正如brulak建议的那样,最好保留转换 为 U

  • 本文向大家介绍c#检测文本文件编码的方法,包括了c#检测文本文件编码的方法的使用技巧和注意事项,需要的朋友参考一下 C#如何检测文本文件的编码,本文为大家分享了示例代码,具体内容如下 使用方法: 以上就是本文的全部内容,希望对大家学习C#程序设计有所帮助。

  • 问题内容: 我保存了Java源文件,将其编码类型指定为UTF-8(使用记事本,默认情况下,记事本的编码类型为ANSI),然后尝试使用以下命令对其进行编译: 但它给出了错误信息” 还有什么其他方法可以编译吗? 来源如下: 问题答案: 您的文件 被 读为UTF-8,否则有值“65279”字符就绝不可能出现。期待你的源代码是在平台默认的编码,根据该文件: 如果未指定 -encoding ,则使用平台默认