C#与JavaScript中UTF-8编码错误字符串修复咨询
修复UTF-8乱码(Adrián José → Adrián José)的解决方案
问题本质
这个乱码是典型的编码二次错误:原本的UTF-8字节序列(对应Adrián José)被错误地用单字节编码(如Windows-1252/ISO-8859-1)解码成了字符串,现在需要反向操作还原正确内容。
C# 解决方案
你之前的代码颠倒了编码转换逻辑,正确步骤是先将乱码字符串还原为被错误解码的原始字节,再用UTF-8解码:
var badString = "Adrián José"; // 用Windows-1252编码(对应Notepad++里的"ANSI")将乱码转成字节数组 byte[] misinterpretedBytes = Encoding.GetEncoding(1252).GetBytes(badString); // 用UTF-8解码字节数组,得到正确字符串 string fixedString = Encoding.UTF8.GetString(misinterpretedBytes); // 输出结果:Adrián José
无效原因说明
你原本尝试用UTF-8获取乱码的字节,相当于对已错误解码的字符串再次做UTF-8编码,完全偏离了还原原始字节的逻辑。正确思路是通过单字节编码(Windows-1252)把乱码还原成最初的UTF-8字节,再解码。
JavaScript 解决方案(无需escape())
使用标准TextEncoder/TextDecoderAPI替代escape()方案:
const badString = "Adrián José"; // 用Latin1(ISO-8859-1)编码将乱码转成Uint8Array(与Windows-1252兼容度极高) const misinterpretedBytes = new TextEncoder('latin1').encode(badString); // 用UTF-8解码字节数组 const fixedString = new TextDecoder('utf-8').decode(misinterpretedBytes); // 输出结果:Adrián José
工具/Notepad++的修复原理
在线字符集修复工具和Notepad++的编码转换逻辑完全一致:
- 将乱码字符串按单字节编码(如Windows-1252/ISO-8859-1)转换为字节序列;
- 用UTF-8解码该字节序列,还原出正确的Unicode字符串。
内容的提问来源于stack exchange,提问作者adrianjgp
相关产品推荐
相关产品推荐

