TypeScript字符串转Hex后Python转回报错,求问题原因及解决方法
问题:TypeScript转十六进制后Python解码失败
需求是TypeScript将字符串转为十六进制输出,Python读取该十六进制后转回字符串,但运行时出现如下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa6 in position 0: invalid start byte
现有代码
TypeScript原代码
function stringToHex(str: string): string { return str.split('').map(char => char.charCodeAt(0).toString(16)).join(''); }
Python原代码
def hexToString(hex_str: str) -> str: return bytes.fromhex(hex_str).decode('utf-8')
问题原因
- 十六进制长度不对齐:
charCodeAt(0).toString(16)会生成1位(如换行符\n的码值10转十六进制是a)或多位十六进制字符串,拼接后总长度可能为奇数。Python的bytes.fromhex要求输入必须是偶数长度,每两个字符对应一个字节,单字符的十六进制会和相邻字符组成错误字节(比如a+6变成0xa6,不是有效的UTF-8起始字节)。 - 编码格式不匹配:
charCodeAt返回的是字符串的UTF-16码元,而Python是按UTF-8解码。部分非ASCII字符在UTF-8中是多字节结构,但UTF-16码元转十六进制后无法对应UTF-8的字节规则,导致解码失败。
解决方案
修改TypeScript代码,先将字符串转为标准UTF-8字节数组,再统一将每个字节转为两位十六进制字符串(不足两位补前导0):
修正后的TypeScript代码
function stringToHex(str: string): string { const encoder = new TextEncoder(); const utf8Bytes = encoder.encode(str); return Array.from(utf8Bytes) .map(byte => byte.toString(16).padStart(2, '0')) .join(''); }
逻辑说明
TextEncoder会将字符串转为标准UTF-8字节数组,确保每个字符对应正确的UTF-8字节结构。padStart(2, '0')保证每个字节的十六进制是两位,彻底避免长度不对齐的问题。- Python端代码无需修改,
bytes.fromhex能正确解析偶数长度的UTF-8十六进制字符串,再通过decode('utf-8')转回原字符串。
内容的提问来源于stack exchange,提问作者vesii
相关产品推荐
相关产品推荐

