Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有Python库函数尝试猜测某些字节的字符编码?_Python_Email_Character Encoding_Invalid Characters - Fatal编程技术网

是否有Python库函数尝试猜测某些字节的字符编码?

是否有Python库函数尝试猜测某些字节的字符编码?,python,email,character-encoding,invalid-characters,Python,Email,Character Encoding,Invalid Characters,我正在用Python编写一些邮件处理软件,在标题字段中遇到奇怪的字节。我怀疑这只是格式错误的邮件;消息本身声称是us ascii,因此我认为没有真正的编码,但我希望得到一个近似于原始字符串的unicode字符串,而不抛出UnicodeDecodeError 因此,我正在寻找一个函数,它接受一个str和一些可选的提示,并做一些达恩德测试以返回一个unicode。我当然可以写一个,但是如果这样一个函数存在的话,它的作者可能会更深入地思考解决这个问题的最佳方法 我还知道Python的设计更喜欢显式而不

我正在用Python编写一些邮件处理软件,在标题字段中遇到奇怪的字节。我怀疑这只是格式错误的邮件;消息本身声称是us ascii,因此我认为没有真正的编码,但我希望得到一个近似于原始字符串的unicode字符串,而不抛出
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')