Python默认编码后以UTF-16解码所得特殊字符串名称及JS复现方法
这类错位字符串的本质
你观察到的这类无实际语义的汉字字符串,是端序错配产生的经典解码乱码,不存在独立的专项命名,核心形成逻辑是:
- 初始字符串首先按UTF-8规则编码为连续单字节流(对应Python中
str.encode()的默认行为) - 程序在解码时,没有校验字节流开头的BOM标记,直接默认按小端序UTF-16规则,每2个连续字节拼凑为一个16位Unicode码位完成解码
- 由于UTF-8编码下的英文字符均为单字节长度,每两个相邻字节拼凑出的数值恰好大量落在CJK统一汉字的码位区间,最终输出的内容就会呈现为一串看似随机的汉字。
JavaScript 1:1 复现代码
要完全对齐Python示例的执行效果,需要严格匹配Python两个核心步骤的默认行为,不能直接套用JS内置的通用解码API,完整实现逻辑如下:
function replicateMisdecode(inputStr) { // 1. 按UTF-8编码输入字符串,对齐Python str.encode() 默认行为 const utf8Bytes = new TextEncoder().encode(inputStr); let output = ''; // 2. 按小端序规则每2个字节拼装为UTF-16码位,对齐Python无BOM时utf-16解码的默认行为 for (let i = 0; i < utf8Bytes.length; i += 2) { const lowByte = utf8Bytes[i]; // 奇数长度字符串自动补0凑组,匹配Python解码时的边界处理逻辑 const highByte = i + 1 < utf8Bytes.length ? utf8Bytes[i + 1] : 0; const codePoint = (highByte << 8) | lowByte; output += String.fromCharCode(codePoint); } return output; } // 测试调用,和Python示例输入对齐 console.log(replicateMisdecode("some random string")) // 输出与Python完全一致:潳敭爠湡潤瑳楲杮
关键实现注意点
- 不要直接使用JS内置的
TextDecoder('utf-16')实现复现:该API处理无BOM标记的字节流时,默认采用大端序解码,和Python无BOM时默认小端序的规则存在行为差异,直接调用会得到完全不同的乱码结果 - 这类乱码没有特殊的存储结构或专有格式,本质只是解码逻辑错配产生的临时字符串,不需要特殊的解析规则
- 边界场景下,当输入字符串长度为奇数时,Python会在字节流末尾补一个0字节凑成整数组完成解码,JS实现中需要补该逻辑才能完全对齐行为
内容的提问来源于stack exchange,提问作者Clément Guibout
相关产品推荐
相关产品推荐

