Python反斜杠分隔十六进制串转字节对象异常排查与解决
Python 反斜杠分隔十六进制字符串转字节对象解决方案
两种操作结果差异的原因
两种写法的本质完全不同:
- 直接写
a = '\xEC\xA3\xBC...'时,\xXX是Python原生的十六进制转义序列,代表单个Unicode字符,对应码点为0xXX,比如\xEC对应U+00EC,整个字符串长度等于十六进制段的数量 - 用
replace('\\','\\x')得到的结果,是4个普通字符组成的序列:\、x、E、C,没有转义效果,整个字符串长度是十六进制段数量的4倍,自然编码后得不到预期结果。
解决方案
要实现'\EC\A3\BC\EC\8B\9D\ED\9A\8C\EC\82\AC'到对应字节对象的转换,有两种简便的实现方式:
方案1:直接提取十六进制串转换
字符串结构为固定的\XX分段,只需要去掉所有反斜杠得到连续十六进制字符串,直接用bytes.fromhex转换即可:
# 输入字符串,加r避免默认转义 subject = r'\EC\A3\BC\EC\8B\9D\ED\9A\8C\EC\82\AC' # 去掉所有反斜杠得到连续十六进制串 hex_str = subject.replace('\\', '') # 转换为字节对象 b = bytes.fromhex(hex_str) # 解码得到最终结果 print(b.decode('utf-8')) # 输出:주식회사
方案2:用codecs模块的escape_decode转换
也可以直接利用Python内置的转义解码能力实现:
import codecs subject = r'\EC\A3\BC\EC\8B\9D\ED\9A\8C\EC\82\AC' # 直接按转义规则解码为字节 b = codecs.escape_decode(subject)[0] print(b.decode('utf-8')) # 输出:주식회사
内容的提问来源于stack exchange,提问作者유호영
相关产品推荐
相关产品推荐

