登录
首页 >  文章 >  前端

codePointAt提取Unicode控制符方法解析

时间:2026-05-06 19:12:54 350浏览 收藏

本文深入解析了如何利用 JavaScript 的 `codePointAt()` 方法准确识别和提取 Unicode 控制字符——它并非直接“提取隐藏符”的黑魔法,而是通过安全遍历(自动处理代理对)结合关键码点范围判断(涵盖 C0/C1 控制符、格式化符如 ZWSP/RLO、BOM 等共七大区间),实现对不可见功能字符的精准定位与标记;文末提供可直接运行的实战代码,帮你告别因错误遍历导致的乱码误判,在字符串清洗、安全审计或调试隐形问题时真正掌控每一个“看不见”的字符。

如何利用 String.prototype.codePointAt() 遍历原始文本并提取隐藏的 Unicode 控制符

codePointAt() 本身不用于“提取隐藏控制符”,而是获取指定位置的 Unicode 码点值;要识别控制符,需结合码点范围判断——关键在遍历 + 条件过滤。

理解哪些码点属于 Unicode 控制字符

Unicode 控制字符(C0/C1 控制符、格式化符、私用区以外的不可见功能符)主要分布在以下范围:

  • U+0000–U+001F(C0 控制符,如 \u0000 NUL、\u0009 TAB、\u000A LF)
  • U+007F(DEL)
  • U+0080–U+009F(C1 控制符,如 \u0085 NEL)
  • U+2000–U+200FU+2028–U+202EU+2060–U+206F(常用格式控制符,如 ZWSP \u200B、LRM \u200E、RLO \u202E
  • U+FEFF(BOM,零宽无断空格,常被误用为隐藏标记)

用 codePointAt() 安全遍历所有码点(含代理对)

普通 for (let i = 0; i 会把代理对(surrogate pair)拆成两个错误码点;codePointAt(i) 自动处理代理对,且返回完整码点,但需配合 String.fromCodePoint() 和跳过后续代理高位:

  • 调用 str.codePointAt(i) 获取当前位置码点
  • 若返回值 ≥ 0x10000,说明是代理对,下一位(i+1)属于该字符,下次循环应跳过它(即 i++
  • 否则正常递增 i

提取并标记控制符的实际代码示例

以下函数返回所有控制符的位置、码点、名称(简略)和原始表示:

function findControlChars(str) {
  const controls = [];
  for (let i = 0; i = 0x10000) i++; 

    // 判断是否为常见控制/格式字符
    if (
      (cp >= 0x0000 && cp = 0x0080 && cp = 0x2000 && cp = 0x2028 && cp = 0x2060 && cp 

<h3>注意边界与实际用途</h3>
<p>提取到的控制符未必“恶意”——它们可能合法存在于富文本、国际化排版或协议数据中。真正需警惕的是:</p>
  • 用户输入中意外混入的 \u202E(强制反转显示,用于视觉欺骗)
  • \u200B 拆分单词绕过关键词过滤
  • BOM 开头干扰 JSON 解析或脚本执行
  • 非打印控制符导致正则匹配、长度计算、DOM 渲染异常

因此,检测后应根据场景选择:日志记录、清理(replace() 过滤)、转义显示,或拒绝输入。

理论要掌握,实操不能落!以上关于《codePointAt提取Unicode控制符方法解析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>