gpt4 book ai didi

python - 为什么我可以将 UTF-8 字节字符串解码为 ISO8859-1 并在没有任何 UnicodeEncodeError/UnicodeDecodeError 的情况下再次解码?

转载 作者:行者123 更新时间:2023-12-04 02:26:42 29 4
gpt4 key购买 nike

为什么下面的代码在 Python 中没有任何错误?

>>> '你好'.encode('UTF-8').decode('ISO8859-1')
'ä½\xa0好'
>>> _.encode('ISO8859-1').decode('UTF-8')
'你好'

我原以为它会因 UnicodeEncodeError 或 UnicodeDecodeError 而失败

是否存在 ISO8859-1 和 UTF-8 的某些属性,以便我可以采用任何 UTF-8 编码的字符串并将其解码为 ISO8859-1 字符串,稍后可以将其反转以获得原始的 UTF-8 字符串?

我正在使用仅支持 ISO8859-1 字符集的旧数据库。开发人员似乎能够通过将 UTF-8 编码字符串解码为 ISO8859-1,并将生成的垃圾字符串存储在数据库中,将中文和其他语言存储在该数据库中。查询该数据库的下游系统必须将垃圾字符串编码为 ISO8859-1,然后使用 UTF-8 解码结果以获得正确的字符串。

我原以为这样的过程根本行不通。

我错过了什么?


最佳答案

ISO-8859-1的特殊属性是它所代表的256个字符与前256个Unicode码位1:1对应,所以字节00h解码为U+0000,字节FFh解码为U+00FF。

因此,如果您编码为 UTF-8 并解码为 ISO-8859-1,您将得到一个由值与 UTF-8 匹配的代码点组成的 Unicode 字符串字节编码:

>>> s = '你好'
>>> s.encode('utf8').hex()
'e4bda0e5a5bd'
>>> s.encode('utf8').decode('iso-8859-1')
'ä½\xa0好'
>>> for c in u:
... print(f'{c} U+{ord(c):04X}')
...
ä U+00E4 # Unicode code points are the same as the bytes of UTF-8.
½ U+00BD
  U+00A0
å U+00E5
¥ U+00A5
½ U+00BD
>>> u.encode('iso-8859-1').hex() # transform back to bytes.
'e4bda0e5a5bd'
>>> u.encode('iso-8859-1').decode('utf8') # and decode to UTF-8 again.
'你好'

任何具有所有 256 个字节表示的 8 位编码也可以工作,只是不会是 1:1 映射。代码页 1256 就是这样一种编码:

>>> for c in s.encode('utf8').decode('cp1256'):
... print(f'{c} U+{ord(c):04X}')
...
ن U+0646 # This would still .encode('cp1256') back to byte E4, for example
½ U+00BD
  U+00A0
ه U+0647
¥ U+00A5
½ U+00BD

关于python - 为什么我可以将 UTF-8 字节字符串解码为 ISO8859-1 并在没有任何 UnicodeEncodeError/UnicodeDecodeError 的情况下再次解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67100281/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com