如何用原生JavaScript将Unicode字符转换为HTML数字实体
问题原因
乱码的核心是循环遍历逻辑没有适配占2个UTF-16码元的Unicode代理对字符:
- JavaScript中字符串的
length属性统计的是UTF-16码元的数量,不是实际Unicode字符的数量,类似🙂、𝌆这类位于辅助平面的字符会占用2个码元 - 原有代码循环每次固定将索引i加1,处理完代理对的第一个码元并转成实体后,下一次循环会单独读取代理对的第二个残余码元,这个码元本身是不合法的Unicode字符,编码后就会出现乱码黑钻石�符号
修复后的编码函数
修改循环逻辑,检测到当前字符是代理对时,将i多跳1位跳过第二个码元即可,原有codePointAt的polyfill无需调整:
function html_encode(s) { var ret_val = ''; var i = 0; while (i < s.length) { var code = s.codePointAt(i); if (code > 127) { ret_val += '&#' + code + ';'; } else { ret_val += s.charAt(i); } // 代理对占用2个码元,索引跳2位,否则跳1位 i += code > 0xFFFF ? 2 : 1; } return ret_val; }
he.js报错问题说明
你下载的是he.js的源代码模板文件,其中<%= encodeMap %>是构建阶段使用的模板变量语法,未经过编译直接引入就会报语法错误,下载已经编译完成的生产版本文件即可正常使用。
内容的提问来源于stack exchange,提问作者abe1432181
相关产品推荐
相关产品推荐

