是否有Python库函数尝试猜测某些字节的字符编码?
我正在用Python编写一些邮件处理软件,在标题字段中遇到奇怪的字节。我怀疑这只是格式错误的邮件;消息本身声称是us ascii,因此我认为没有真正的编码,但我希望得到一个近似于原始字符串的unicode字符串,而不抛出是否有Python库函数尝试猜测某些字节的字符编码?,python,email,character-encoding,invalid-characters,Python,Email,Character Encoding,Invalid Characters,我正在用Python编写一些邮件处理软件,在标题字段中遇到奇怪的字节。我怀疑这只是格式错误的邮件;消息本身声称是us ascii,因此我认为没有真正的编码,但我希望得到一个近似于原始字符串的unicode字符串,而不抛出UnicodeDecodeError 因此,我正在寻找一个函数,它接受一个str和一些可选的提示,并做一些达恩德测试以返回一个unicode。我当然可以写一个,但是如果这样一个函数存在的话,它的作者可能会更深入地思考解决这个问题的最佳方法 我还知道Python的设计更喜欢显式而不
UnicodeDecodeError
因此,我正在寻找一个函数,它接受一个str
和一些可选的提示,并做一些达恩德测试以返回一个unicode
。我当然可以写一个,但是如果这样一个函数存在的话,它的作者可能会更深入地思考解决这个问题的最佳方法
我还知道Python的设计更喜欢显式而不是隐式,标准库的设计是为了避免在解码文本时使用隐式魔法。我只想明确地说“继续猜测”。+1表示模块(建议)
它不在标准库中,但您可以使用以下命令轻松安装它:
$ pip install chardet
:
看看你是否没有。我发现最好的方法是在try-except块中迭代尝试使用每个最常见的编码来解码prospect。据我所知,标准库没有函数,尽管按照上面的建议编写函数并不太困难。我想我真正想要的是一种解码字符串并保证它不会抛出异常的方法。string.decode的errors参数会执行此操作
def decode(s, encodings=('ascii', 'utf8', 'latin1')):
for encoding in encodings:
try:
return s.decode(encoding)
except UnicodeDecodeError:
pass
return s.decode('ascii', 'ignore')
你不觉得ISO-8859-2是胡说八道吗?@John Machin:是的。这是一种教育,表明你不应该盲目相信它。当前结果不同('utf-8'和'ascii'对应)。您可以跳过结尾处的
'ascii'
大小写,只使用latin1
,因为latin1
将对所有256字节的值进行无误解码。
def decode(s, encodings=('ascii', 'utf8', 'latin1')):
for encoding in encodings:
try:
return s.decode(encoding)
except UnicodeDecodeError:
pass
return s.decode('ascii', 'ignore')