无法在Python中获取特殊数字对应的原始字符

1 投票
1 回答
108 浏览
提问于 2025-04-14 18:09

我正在解码一个包含特殊字符的字符串,比如“こんにちは①”。

这些字符的Base64格式是:'GyRCJDMkcyRLJEEkTy0hGyhC'

在把这个Base64转换成字节(s_bytes)后,当我执行解码命令时,出现了下面的错误。


>>> s_decode=s_bytes.decode('iso-2022-jp')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'iso2022_jp' codec can't decode bytes in position 13-14: illegal multibyte sequence

所以,有人能解释一下这是不是因为Python的某些限制导致的吗?

1 个回答

4

首先要解码这个Base64字符串:

import base64
seq = base64.b64decode('GyRCJWEhPCVrQXc/Li0iGyhC?=')
print(seq)
# b'\x1b$B%a!<%kAw?.-"\x1b(B'

这是一个ISO-2022-JP的字节序列。ISO-2022-JP支持在多种字符集之间切换。

\x1b$B可以切换到JIS X 0208-1983(每个字符用2个字节表示)。\x1b(B则切换回ASCII,所以JIS X 0208-1983的序列是%a!<%kAw?.-"。问题字符是最后一个字符,它由-"表示,前导字节是\x2D,后续字节是\x22

前导字节对应于JIS X 0208-1983的第13行,这一行包含了一些NEC特殊字符。

所以\x2D\x22表示的字符是②。

需要注意的是,并不是所有的ISO-2022-JP编码/解码配对都支持第13行。不幸的是,Python的编码库不支持。

而Windows的对应库,以及WHATWG编码规范和网页浏览器的实现是支持的。

因此,需要使用一个替代方案。endec模块提供了与WHATWG编码规范兼容的编码和解码解析器。

安装这个模块:

pip install endec

然后在之前的代码基础上继续:

import endec
result = endec.decode(seq, "iso-2022-jp")
print(result)
# メール送信②

编辑:

正如评论中提到的,endec模块目前还在开发初期。Python对Microsoft和Web实现的ISO-2022-JP支持不足,但扩展字符的使用频率不高,所以建议默认使用Python的核心编码库,只有在必要时再使用endec作为最后的选择。

try:
    result = seq.decode('iso-2022-jp')
except UnicodeDecodeError:
    result = endec.decode(seq, "iso-2022-jp")

撰写回答