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()
抛出一个例外。
有什么办法可以避免这个例外,例如:在转换之前判断类型?
- 你不解码为UTF-8,你编码为 UTF-8或解码从。
- 即使只是ASCII,您也可以安全地从UTF8解码。 ASCII是UTF8的一个子集。
-
最简单的方法来检测,如果它需要解码与否是
if not isinstance(data, unicode): # It's not Unicode! data = data.decode('UTF8')
小改正:检查的类型是“unicode”,而不是“Unicode”。 – 2010-12-16 14:02:03
斑点!谢谢! – 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'))
人对如何改善这种代码的一些想法? ;)
对降票的评论将不胜感激... – 2018-01-03 18:53:37
注意:unicode和UTF-8不是一回事。 – 2010-12-16 13:40:37