当前位置:  开发笔记 > 编程语言 > 正文

如何确定文本的编码?

如何解决《如何确定文本的编码?》经验,为你挑选了4个好方法。

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



1> nosklo..:

始终正确地检测编码是不可能的.

(来自chardet FAQ :)

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

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

您也可以使用UnicodeDammit.它将尝试以下方法:

在文档本身中发现的编码:例如,在XML声明中或(对于HTML文档)的http-equiv META标记.如果Beautiful Soup在文档中找到这种编码,它会从头开始再次解析文档并尝试新编码.唯一的例外是如果您明确指定了编码,并且该编码实际上有效:那么它将忽略它在文档中找到的任何编码.

通过查看文件的前几个字节来嗅探编码.如果在此阶段检测到编码,则它将是UTF-*编码,EBCDIC或ASCII之一.

如果安装了chardet库,则会对其进行嗅探.

UTF-8

Windows的1252


@Geomorillo:没有"编码标准"这样的东西.文本编码与计算一样古老,它随着时间和需求而有机地增长,没有计划."Unicode"试图解决这个问题.

2> Hamish Downe..:

计算编码的另一个选择是使用 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)


`libmagic`确实是`chardet`的可行替代品.以及名为`python-magic`的独特包装上的精彩信息!我确信这种模糊性会让很多人感到害怕
`sudo apt-get install python3-magic` for python3

3> zzart..:

一些编码策略,请取消注释:

#!/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              



4> ryanjdillon..:

这是一个读取和获取面值chardet编码预测的示例,n_lines在文件很大的情况下从文件中读取.

chardet还给你一个概率(即confidence)它的编码预测(没有看到它们是如何得出的),它与它的预测一起返回chardet.predict(),所以如果你愿意,你可以以某种方式工作.

def predict_encoding(file_path, n_lines=20):
    '''Predict a file's encoding using chardet'''
    import chardet

    # Open the file as binary data
    with open(file_path, 'rb') as f:
        # Join binary lines for specified number of lines
        rawdata = b''.join([f.readline() for _ in range(n_lines)])

    return chardet.detect(rawdata)['encoding']


我已经用这种方式修改了这个功能:`defpredict_encoding(file_path,n = 20):... skip ...然后rawdata = b''。join([[f.read()for range in(n)中的_] )`已在Python 3.6上尝试过此功能,与“ ascii”,“ cp1252”,“ utf-8”,“ unicode”编码完美兼容。因此,这绝对是正确的。
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有