python unicode:如何判断一个字符串是否需要解码为utf-8?

python unicode:如何判断一个字符串是否需要解码为utf-8?

问题描述:

我有一个功能接受来自网络的请求。大多数情况下,传入的字符串不是unicode,但有时候是这样。python unicode:如何判断一个字符串是否需要解码为utf-8?

我有代码,一切转换为Unicode,但它显示该错误信息:

message.create(username, unicode(body, "utf-8"), self.get_room_name(),\ 
TypeError: decoding Unicode is not supported 

我认为原因是“身体”的参数已经是unicode的,所以unicode()抛出一个例外。

有什么办法可以避免这个例外,例如:在转换之前判断类型?

+5

注意:unicode和UTF-8不是一回事。 – 2010-12-16 13:40:37

  1. 你不解码为UTF-8,你编码为 UTF-8或解码从
  2. 即使只是ASCII,您也可以安全地从UTF8解码。 ASCII是UTF8的一个子集。
  3. 最简单的方法来检测,如果它需要解码与否是

    if not isinstance(data, unicode): 
        # It's not Unicode! 
        data = data.decode('UTF8') 
    
+0

小改正:检查的类型是“unicode”,而不是“Unicode”。 – 2010-12-16 14:02:03

+0

斑点!谢谢! – 2010-12-16 14:14:42

您可以使用此:

try: 
    body = unicode(body) 
except UnicodeDecodeError: 
    body = body.decode('utf8') 

或者这样:

try: 
    body = unicode(body, 'utf8') 
except TypeError: 
    body = unicode(body) 

马克Pilgrim写了一个Python库来猜测文本编码:

在Unicode和UTF-8,他的书第4章的头两节 '深入Python 3' 是相当巨大的:

这就是我用的:

def to_unicode_or_bust(obj, encoding='utf-8'): 
    if isinstance(obj, basestring): 
     if not isinstance(obj, unicode): 
      obj = unicode(obj, encoding) 
    return obj 

这是一个从这个问题所作:http://farmdev.com/talks/unicode/

这是一个使用它的示例代码:

def hash_it_safe(s): 
    try: 
     s = to_unicode_or_bust(s) 
     return hash_it_basic(s) 
    except UnicodeDecodeError: 
     return hash_it_basic(s) 
    except UnicodeEncodeError: 
     assert type(s) is unicode 
     return hash_it_basic(s.encode('utf-8')) 

人对如何改善这种代码的一些想法? ;)

+0

对降票的评论将不胜感激... – 2018-01-03 18:53:37