Python 如何检测字符串是否已被utf8编码?
我有一些字符串如下:Python 如何检测字符串是否已被utf8编码?,python,python-2.7,character-encoding,mojibake,Python,Python 2.7,Character Encoding,Mojibake,我有一些字符串如下: u'Thaïlande' 这是“Thaïlande”,我不知道它是如何编码的,但我需要把它带回“Thaïlande”,然后URL编码它 有没有办法猜测一个字符串是否已经用Python2编码过?您有所谓的。您可以使用统计分析来查看在UTF-8字节的典型组合中是否存在数量异常的拉丁-1字符,或者是否存在任何CP1252特定字符 已经有一个软件包可以为您执行此操作,并在检测到Mojibake时修复损坏:: ftfy的目标是接收坏的Unicode并输出好的Unicode,以便
u'Thaïlande'
这是“Thaïlande”,我不知道它是如何编码的,但我需要把它带回“Thaïlande”,然后URL编码它
有没有办法猜测一个字符串是否已经用Python2编码过?您有所谓的。您可以使用统计分析来查看在UTF-8字节的典型组合中是否存在数量异常的拉丁-1字符,或者是否存在任何CP1252特定字符
已经有一个软件包可以为您执行此操作,并在检测到Mojibake时修复损坏::
ftfy的目标是接收坏的Unicode并输出好的Unicode,以便在支持Unicode的代码中使用
及
fix_encoding()函数将查找mojibake的证据,如果可能的话,它将撤消生成该证据的过程,以返回应该存在的文本
这听起来不可能吗?真的不是。UTF-8是一种设计良好的编码,当它被误用时,它会变得很明显,而mojibake字符串通常包含恢复原始字符串所需的所有信息
你有一个所谓的。您可以使用统计分析来查看在UTF-8字节的典型组合中是否存在数量异常的拉丁-1字符,或者是否存在任何CP1252特定字符
已经有一个软件包可以为您执行此操作,并在检测到Mojibake时修复损坏::
ftfy的目标是接收坏的Unicode并输出好的Unicode,以便在支持Unicode的代码中使用
及
fix_encoding()函数将查找mojibake的证据,如果可能的话,它将撤消生成该证据的过程,以返回应该存在的文本
这听起来不可能吗?真的不是。UTF-8是一种设计良好的编码,当它被误用时,它会变得很明显,而mojibake字符串通常包含恢复原始字符串所需的所有信息
你的样品不完整。请提供实际错误字符串的
repr()
输出。您缺少一些不可打印的字节。您的示例不完整。请提供实际错误字符串的repr()
输出。您缺少了一些不可打印的字节。我已经指出了我的问题:如果您查看urllibdef unquote(s):
的源代码,您将看到append(unquote(str(bits[I])).decode('latin1'))
是“latin1”,而我的代码是utf-8。我不知道为什么我是唯一一个有这个问题,但我将不得不重新编写自己的GET参数处理。。。似乎unquote()
有缺陷。我看到@OlivierPons:这只适用于传入unicode字符串的情况。如果你有UTF-8字节,就不要传入Unicode字符串。@OlivierPons:虽然我同意urlib.unquote()
和urlparse.unquote()
函数在这种行为中基本上是不正确的,但解决办法是确保传入ASCII字节:unquote(unicodest.encode('ASCII')).decode('utf8')
,在这里,我假设条目已经正确地进行了URL编码(这意味着它也是ASCII安全的)。你让我高兴极了!我不得不复制粘贴parse_qsl
,这是错误的(也是python27核心的一部分),因为它确实unquote(nv[1]。replace(+','')
,而它应该这样做-如果我错了请纠正-unquote(nv[1]。encode('ascii')。replace('+','')
您将已经编码为ascii的URL传递给parse_qsl()
。我已经指出了我的问题:如果您查看urllibdef unquote(s):
的源代码,您将看到append(unquote(str(bits[I])).decode('latin1'))
是“latin1”,而我的代码是utf-8。我不知道为什么我是唯一一个有这个问题,但我将不得不重新编写自己的GET参数处理。。。似乎unquote()
有缺陷。我看到@OlivierPons:这只适用于传入unicode字符串的情况。如果你有UTF-8字节,就不要传入Unicode字符串。@OlivierPons:虽然我同意urlib.unquote()
和urlparse.unquote()
函数在这种行为中基本上是不正确的,但解决办法是确保传入ASCII字节:unquote(unicodest.encode('ASCII')).decode('utf8')
,在这里,我假设条目已经正确地进行了URL编码(这意味着它也是ASCII安全的)。你让我高兴极了!我不得不复制粘贴parseqsl
,这是一个错误(也是python27核心的一部分),因为它确实unquote(nv[1]。replace(+','')
,而它应该这样做-如果我错了,请更正-unquote(nv[1]。encode('ascii')。replace('+','')
您将已经编码为ascii的URL传递到parseqsl()
。