2024-05-19 13:25:05 发布
网友
以下两个字符串格式不同,但数据相同:
str1 = '\xd7\x91\xd7\xa8\xd7\xa7' str2 = u'\u05d1\u05e8\u05e7'
我需要实现以下功能:
我知道我可以把第二种格式的字符串编码成第一种格式。你知道吗
但是如何确定输入字符串确实是以第二种格式给出的呢?你知道吗
对于python3.x,正确的做法可能是try调用encode。(对于3.5+,这个will hopefully就像try s.encode('utf-8') except AttributeError: s一样简单。)
try
encode
try s.encode('utf-8') except AttributeError: s
但是对于2.x,encode即使在str1上也会成功—首先将UTF-8字符串解码为ASCII(或者sys.getdefaultencoding()返回的任何内容),这样它就可以重新编码它,所以您肯定不希望这样。你知道吗
str1
sys.getdefaultencoding()
当无法安全地EAFP时,您别无选择,只能LBYL。所以:
if isinstance(s, unicode): return s.encode('utf-8') else: return s
注意,我在这里使用的是^{},而不是调用type和比较。正如PEP 8所说:
type
Object type comparisons should always use isinstance() instead of comparing types directly.
isinstance()
为什么?因为根据定义,子类型的实例(子类、用abc注册的类等)总是被认为是它们的父类型的实例。在一些罕见的情况下,您需要显式地打破这个规则,在这种情况下type比较就是您想要的。否则,不要使用它们。你知道吗
对于python3.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。所以:
注意,我在这里使用的是^{} ,而不是调用
type
和比较。正如PEP 8所说:为什么?因为根据定义,子类型的实例(子类、用abc注册的类等)总是被认为是它们的父类型的实例。在一些罕见的情况下,您需要显式地打破这个规则,在这种情况下
type
比较就是您想要的。否则,不要使用它们。你知道吗相关问题 更多 >
编程相关推荐