确定Python中文本的编码

我收到了一些编码的文本,但我不知道使用了什么字符集。 有没有一种方法来确定使用Python的文本文件的编码? 如何检测处理C#的文本文件的编码/代码页。


正确检测编码是不可能的

(来自chardet常见问题:)

但是,某些编码已针对特定语言进行了优化,语言不是随机的。 一些字符序列总是弹出,而其他序列没有意义。 一个英文流利的人打开报纸,发现“txzqJv 2!dasd0a QqdKjvz”会立即认出那不是英语(尽管它完全是由英文字母组成)。 通过研究大量“典型”文本,计算机算法可以模拟这种流畅性,并对文本的语言进行有教育的猜测。

chardet库使用该研究来尝试检测编码。 chardet是Mozilla中自动检测代码的一个端口。

你也可以使用UnicodeDammit。 它会尝试以下方法:

  • 在文档中发现的一种编码:例如,在XML声明中或(对于HTML文档)一个http-equiv META标签。 如果Beautiful Soup在文档中发现这种编码,它会从头开始再次解析文档,并尝试新编码。 唯一的例外是,如果您明确指定了编码,并且该编码实际上起作用:那么它将忽略它在文档中找到的任何编码。
  • 通过查看文件的前几个字节来查看编码。 如果在此阶段检测到编码,它将是UTF- *编码,EBCDIC或ASCII之一。
  • 由chardet库嗅探的编码,如果已安装它。
  • UTF-8
  • Windows的1252

  • 编制编码的另一个选择是使用libmagic(这是file命令的后面的代码)。 有大量的python绑定可用。

    生活在文件源树中的python绑定可用作python-magic(或python3-magic)debian软件包。 如果可以通过执行以下操作来确定文件的编码:

    import magic
    
    blob = open('unknown-file').read()
    m = magic.open(magic.MAGIC_MIME_ENCODING)
    m.load()
    encoding = m.buffer(blob)  # "utf-8" "us-ascii" etc
    

    在pypi上有一个同样命名但不兼容的python-magic pip包,它也使用libmagic。 它也可以通过以下方式获得编码:

    import magic
    
    blob = open('unknown-file').read()
    m = magic.Magic(mime_encoding=True)
    encoding = m.from_buffer(blob)
    

    一些编码策略,请注意品味:

    #!/bin/bash
    #
    tmpfile=$1
    echo '-- info about file file ........'
    file -i $tmpfile
    enca -g $tmpfile
    echo 'recoding ........'
    #iconv -f iso-8859-2 -t utf-8 back_test.xml > $tmpfile
    #enca -x utf-8 $tmpfile
    #enca -g $tmpfile
    recode CP1250..UTF-8 $tmpfile
    

    您可能希望通过以循环的形式打开和读取文件来检查编码......但您可能需要先检查文件大小:

    encodings = ['utf-8', 'windows-1250', 'windows-1252' ...etc]
                for e in encodings:
                    try:
                        fh = codecs.open('file.txt', 'r', encoding=e)
                        fh.readlines()
                        fh.seek(0)
                    except UnicodeDecodeError:
                        print('got unicode error with %s , trying different encoding' % e)
                    else:
                        print('opening the file with encoding:  %s ' % e)
                        break              
    
    链接地址: http://www.djcxy.com/p/46795.html

    上一篇: Determine the encoding of text in Python

    下一篇: In Python, how do you get the content