我可以检测字符串中使用的文本编解码器吗?

时间:2014-11-19 15:19:45

标签: python

我正在从文件中读取一个字符串(任何人都可以修改)并且不知道该字符串的编码类型。有没有像

这样的功能
 getCodec = mystring.getCodec()

返回类似

的内容
 getCodec = 'utf-8' 

getCodec = 'ascii'

3 个答案:

答案 0 :(得分:3)

不,没有这样的功能,因为文件不记录用于编写所包含文本的编解码器。

如果有更多上下文(如更具体的格式,如HTML或XML),那么您可以确定编解码器,因为标准指定了默认值或允许使用编解码器注释数据,但是否则你会根据内容(这是像chardet这样的工具)进行猜测。

对于任何人都可以修改的文件,你没有希望,但是要清楚地记录应该使用的编解码器。

答案 1 :(得分:2)

您可以使用第三方chardet模块。

>>> import chardet
>>> chardet.detect(b'\xed\x95\x9c\xea\xb8\x80')  # u'한글'.encode('utf-8')
{'confidence': 0.7525, 'encoding': 'utf-8'}
>>> chardet.detect(b'\xc7\xd1\xb1\xdb')
{'confidence': 0.99, 'encoding': 'EUC-KR'}  # u'한글'.encode('euc-kr')

注意:chardet并非万无一失,如果文件足够小,很容易猜错。

答案 2 :(得分:1)

如果你不能使用chardet并且没有机会提前指定编码,我认为你唯一剩下的办法是简单地猜测它。你可以这样做:

# Add whichever you want to the list, but only end it in a codec like latin1 that never fails
codecs = ["utf-8", "euc-kr", "shift-jis", "latin1"]

def try_decode(text):
    for codec in codecs:
        try:
            return text.decode(codec)
        except UnicodeError:
            continue