对一个字符串进行多次编码(使用相同的编码格式)有什么危害吗?(在Python中)

2024-05-21 23:12:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中使用相同的编码格式对一个字符串进行多次编码有什么危害吗?(即UTF-8)?在

我有一个函数,它使用另一个函数从文档中获取字符串,然后序列化该字符串。目前,第二个函数(从文档中获取字符串的用户)的唯一用户是第一个函数。在

这在将来可能会改变,而且有人可能决定在另一个序列化(或类似)函数中使用它,而不首先将其结果编码为UTF-8。我想知道始终从中返回一个UTF-8编码的字符串是否安全(这个字符串目前也将被序列化函数re-.encode()'d)。我的测试表明这不是问题,但是,我想我应该问问。在

谢谢你!在


Tags: 函数字符串用户文档re危害编码序列化
3条回答

除非字符串是纯ascii,否则是的,它可能会造成伤害(如果是纯ascii,则不需要担心utf-8):

>>> a
u'a \xd7 b'
>>> a.encode("utf-8")
'a \xc3\x97 b'
>>> a.encode("utf-8").encode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)

最好将字节序列和文本视为两种不同的东西。在python3中,它们是不同的:bytes对象有decode()方法,string(unicode)对象有encode()方法。在

你不能多次编码,它不起作用。在

>>> s = u"ä".encode('latin1')
>>> s = s.encode('latin1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

看,你会得到“ascii编解码器不能解码”。字符串上的encode方法的作用是首先将字符串解码为Unicode,然后用给定的编码对其进行再次编码。它将用系统编码解码,默认情况下是ascii。在

这种行为是意外的,在python3中消失了,bytes没有encode方法,string没有decode方法。在

所以你不能对它进行多次编码,当然这是因为编码一个编码字符串没有任何意义。编码是从Unicode转换为二进制表示,您不能进一步编码二进制表示。在

通常,您应该只对unicode对象调用encode,而只对string对象调用decode。在

encode将Unicode对象编码为给定的编码(存储为字符串)。decode将给定的编码解码回Unicode对象。在

2.x中的string.encode和{}的存在应该被视为一个历史文物。在

相关问题 更多 >