You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

问题原因

  1. 十六进制长度不对齐:charCodeAt(0).toString(16)会生成1位(如换行符\n的码值10转十六进制是a)或多位十六进制字符串,拼接后总长度可能为奇数。Python的bytes.fromhex要求输入必须是偶数长度,每两个字符对应一个字节,单字符的十六进制会和相邻字符组成错误字节(比如a+6变成0xa6,不是有效的UTF-8起始字节)。
  2. 编码格式不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18