重复对字符串进行相同编码会有害吗?(在Python中)

1 投票
4 回答
905 浏览
提问于 2025-04-16 08:24

在Python中,把一个字符串多次用同样的编码格式(比如UTF-8)进行编码,会不会有什么坏处呢?

我有一个函数,它会调用另一个函数从文档中获取一个字符串,然后对这个字符串进行序列化。目前,第二个函数(也就是从文档中获取字符串的那个)只有第一个函数在使用。

将来可能会有变化,可能会有人决定在其他序列化(或者类似的)函数中使用它,而不先把结果编码成UTF-8。我在想,始终返回一个UTF-8编码的字符串是否安全(目前这个字符串还会被序列化函数再进行一次.encode())。我的测试显示这似乎没问题,但我想问一下。

谢谢!

4 个回答

1

一般来说,你应该只在 unicode 对象上使用 encode,而只在 string 对象上使用 decode

encode 是把一个 Unicode 对象转换成指定的编码格式(以字符串的形式存储)。而 decode 则是把一个指定的编码格式转换回 Unicode 对象。

在 2.x 版本中出现的 string.encodeunicode.decode 应该被看作是历史遗留的产物。

1

除非这个字符串完全是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)

把字节序列和文本当作两种不同的东西来处理是个好习惯。在Python 3中,它们确实是不同的东西:字节对象有一个decode()方法,而字符串(Unicode)对象有一个encode()方法。

5

你不能多次进行编码,这样是行不通的。

>>> 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 编码无法解码”的错误。字符串的编码方法首先是把字符串解码成 Unicode,然后再用指定的编码进行编码。它会用系统的编码来解码,默认情况下是 ascii。

顺便提一下,这种行为在 Python 3 中已经消失了,在 Python 3 中,字节(bytes)没有编码方法,而字符串(strings)也没有解码方法。

所以你根本不能多次编码,当然这是因为对一个已经编码的字符串再进行编码是没有意义的。编码就是把 Unicode 转换成二进制表示,而你不能再对二进制表示进行进一步的编码。

撰写回答