在 python 3.11 中,我们可以对字符串进行编码,如:
string.encode('ascii', 'backslashreplace')
这对于说:
hellö
=>
hell\\xf6
但是当我插入时
hellö w\\xf6rld
I get
hell\\xf6 w\\xf6rld
(注意第二个有一个看起来像字符转义序列的文字部分)
或者换句话说,以下内容成立:
'hellö wörld'.encode('ascii', 'backslashreplace') == 'hellö w\\xf6rld'.encode('ascii', 'backslashreplace')
这显然意味着数据已因编码而丢失。
有没有办法让python真正正确编码?那么反斜杠本身也被转义了吗?或者图书馆可以这样做吗?
你所观察到的行为是 ASCII 编码和反斜杠替换错误处理方式的预期结果。目的是创建一个 ASCII 安全的字符串表示,其中不可表示的字符被它们的十六进制等价物替换。
问题在于,该方法不能区分原本存在的
\xf6
和因编码产生的
\xf6
。因此,解码时,无法可靠地区分这两者。
解决方案:
为了解决这个问题,你需要使用一种编码方案,该方案可以区分字面反斜杠和用于表示不可表示字符的反斜杠。
一个选择是使用
'unicode-escape'
编码:
>>> 'hellö w\\xf6rld'.encode('unicode-escape')
b'hell\\xf6 w\\\\xf6rld'
>>> 'hellö wörld'.encode('unicode-escape')
b'hell\\xf6 w\\xf6rld'
如你所见,
'unicode-escape'
编码会将原始字符串中的字面反斜杠转义为
\\\\
,同时将表示不可表示字符的反斜杠保留为
\xf6
。解码时,可以正确地反转此过程。
>>> b'hell\\xf6 w\\\\xf6rld'.decode('unicode-escape')
'hellö w\\xf6rld'
>>> b'hell\\xf6 w\\xf6rld'.decode('unicode-escape')
'hellö wörld'
其他选择:
-
使用 Python 的内置序列化方法: 如果你需要存储或传输数据,请考虑使用
pickle
或json
等模块,这些模块处理字符串编码并确保正确解码。 -
Base64 编码: 如果你需要一个 ASCII 安全的表示,并且不介意增加一些开销,可以使用
base64
模块。
记住,选择最合适的编码方案取决于你的具体需求和限制。
标签:python,character-encoding From: 78791781