我正在从文件中读取一个字符串(任何人都可以修改)并且不知道该字符串的编码类型。有没有像
这样的功能 getCodec = mystring.getCodec()
返回类似
的内容 getCodec = 'utf-8'
或
getCodec = 'ascii'
答案 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