无法在Python中获取特殊数字对应的原始字符
我正在解码一个包含特殊字符的字符串,比如“こんにちは①”。
这些字符的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")