如何将字符串中误解析的UTF-8/Unicode字符转换为正确字符?
这种UTF-8乱码我简直熟得不能再熟了!本质就是你的字符串被错误地用单字节编码(比如Latin-1/Windows-1252)解码了,原本的UTF-8多字节字符被拆成了几个奇怪的单字节字符——比如你例子里的’,其实就是正确撇号’的UTF-8字节被乱解出来的结果。直接给你两种场景的解决方案,拿来就能用:
核心修复逻辑
把乱码的字符串反向转换:先把乱码字符转回对应的单字节序列,再用UTF-8重新解码,就能还原出正确的字符。
场景1:只有纯乱码字符(比如
’) 以JavaScript为例,直接用URI编码的技巧实现反向转换,代码简洁高效:
function fixUtf8MangledString(str) { // 先把字符串转成基于Latin-1的URI编码,再用UTF-8解码 return decodeURIComponent(escape(str)); } // 测试你的例子 const string = "This person’s something...."; const fixedstring = fixUtf8MangledString(string); console.log(fixedstring); // 输出:This person's something....
如果是Python,逻辑更直接:
def fix_utf8_mangled_string(s): # 用Latin-1编码把字符串转回字节,再用UTF-8解码 return s.encode('latin-1').decode('utf-8') # 测试 string = "This person’s something...." fixedstring = fix_utf8_mangled_string(string) print(fixedstring)
场景2:同时存在HTML实体(比如
’) 如果字符串里还有像â这种HTML实体编码,需要先把实体转成对应字符,再处理UTF-8乱码:
function fixMixedMangledString(str) { // 第一步:把十进制HTML实体转成字符 const entityFixed = str.replace(/&#(\d+);/g, (_, decimalCode) => { return String.fromCharCode(decimalCode); }); // 第二步:修复UTF-8乱码 return decodeURIComponent(escape(entityFixed)); } // 测试混合场景 const mixedString = "This person’s something...."; const fixedMixed = fixMixedMangledString(mixedString); console.log(fixedMixed); // 输出:This person's something....
额外注意事项
- 如果乱码是Windows-1252编码导致的(比如一些特殊符号),可以把代码里的
latin-1换成cp1252(Python)或者调整对应的编码转换逻辑; - 这种方法对绝大多数常见的UTF-8乱码场景都有效,比如引号、破折号、版权符号等的乱码都能修复。
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

