获取未知格式字符串并返回UTF-8字符串

时间:2014-09-15 23:51:40

标签: python python-2.7 unicode utf-8

以下两个字符串的格式不同,但数据相同:

str1 = '\xd7\x91\xd7\xa8\xd7\xa7'
str2 = u'\u05d1\u05e8\u05e7'

我需要实现以下功能:

  • 以上述任一格式输入一个字符串作为输入
  • 以第一种格式返回等效字符串作为输出

我知道我可以将第二种格式的字符串编码为第一种格式。

但是如何确定输入字符串确实以第二种格式给出?

1 个答案:

答案 0 :(得分:1)

对于Python 3.x,正确的做法可能是try来调用encode。 (对于3.5+,此will hopefully就像try s.encode('utf-8') except AttributeError: s一样简单。)

但对于2.x,encode即使在str1上也会成功 - 首先将UTF-8字符串解码为ASCII(或任何sys.getdefaultencoding()返回),以便它可以重新对它进行编码,所以你绝对不想要它。

如果无法安全地EAFP,您别无选择,只能LBYL。所以:

if isinstance(s, unicode):
    return s.encode('utf-8')
else:
    return s

请注意,我在这里使用isinstance,而不是调用type并进行比较。正如PEP 8所说:

  

对象类型比较应始终使用isinstance(),而不是直接比较类型。

为什么呢?因为根据定义,子类型的实例(子类,用ABC注册的类等)应该总是被视为其超类型的实例。在某些极少数情况下,您明确需要违反该规则,在这种情况下type比较是您想要的。但否则,不要使用它们。