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

如何用原生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:36:06