Unicode 与国际化

不可见字符检测看清差异,再决定清理

逐个查看隐藏位置、类别与影响,清理前先核对。

不可见字符检测

输入文本

检测位置

文本只在当前浏览器处理,不上传。

逐类确认清理范围

所有类别默认不选。选择某类即确认其所述影响;请重新检测,再预览并应用。

Unicode 17.0.0 固定子集:521 个码点及孤立代理。不是完整的字形可见性检测,也不作安全判断。官方字符名称保留 Unicode 表记。

偏移和索引从 0 起;行列从 1 起。列按代码点计算,不是视觉格数。CRLF 算一次换行;CR、LF、NEL、LS、PS 也换行。CRLF 的两个字符都属于前一行。

最多 100,000 个 UTF-16 码元。未改动的 CR/CRLF 按浏览器交付内容保留;新输入换行使用 LF。编辑器可能以规范化换行显示。

高亮标记仅用于显示,不会插入文本。控制符按存储顺序显示而不执行。上下文每侧最多 24 个 UTF-16 码元。

输入文本或载入示例,再检测字符。

肉眼相同的订单号,为什么查不到对应记录?不可见字符检测能把字符串中的隐藏位置展开:看起来只是普通间距的地方,可能是不同码点的空格;没有任何间距的地方,也可能夹着零宽字符。

先取出能复现问题的一小段文字,再对照原系统中的比较结果。隐形字符检测器列出的是需要检查的字符,不会根据一个命中就认定内容有害,也不会擅自修正全部格式。

为什么使用不可见字符检测

找到看不见的不同

不可见字符检测在上下文中标出每个命中,同时给出编码和位置。例如数值与单位之间的不间断空格,视觉上很普通,却能阻止换行,也可能让精确匹配与普通空格产生不同结果。

两行外观相近的文本中,隐藏位置被不同颜色的标记揭示。

给正常的连写留下选择

家庭表情中的连接符、语言排版中的方向标记都有实际用途。所有清理类别默认不选;只选择确实不需要的类别,就能保留其他类别,而不必先全删再设法补回。

选中的一类隐藏标记被移除,连接在一起的符号组合继续保留。

先固定一次检测,再确认改动

01

修改后重新检测

检测采用手动模式,也可按 Ctrl/Cmd+Enter。输入或清理选项变化后,原结果会过期,复制和下载随即禁用。重新检测后,再基于当前快照预览清理。

02

看清空格替换与字符删除的区别

特殊空格会替换成普通空格,其他选中的类别才会删除。预览会展示前后文本与改动数量;选中控制符时尤其要核对制表与换行,避免把两列或两行直接接起来。

03

应用后保留一次回退

应用才会改写输入并更新结果。撤销恢复前一次输入与检测结果。示例和清空若要覆盖已有文本,也先展示替换预览,不会在第一次点击时直接丢掉内容。

从码点到上下文的检查记录

码点、类别和实际影响

每个命中提供 U+ 编码、名称和类别,并用可见标记展开上下文。诊断片段按存储顺序显示方向控制符的占位,不让字符本身重新排列报告内容,以便准确审阅。

同时给出三种位置

UTF-16 偏移与代码点索引从 0 起算,行列从 1 起算,列按代码点计算。补充平面字符占两个 UTF-16 码元,因此索引和偏移不一定相等,也不是屏幕上的视觉列。

分批浏览,完整导出

每次追加显示 50 条发现,JSON 报告包含全部发现与数值位置,但不嵌入完整原文。文本导出对应当前已检测输入;只有应用清理之后,导出的才是清理后的文本。

哪些内容会检查,哪些不会自动改

固定范围,不等于全部不可见字符
使用 Unicode 17 的固定检查表,涵盖控制与格式字符、非 ASCII 空白、变体选择符和指定填充符。格式字符不一定完全不可见或有害;普通 ASCII 空格、相似字形与一般组合重音不在检查范围内。 指定填充符:U+034F / U+115F / U+1160 / U+17B4 / U+17B5 / U+2800 / U+3164 / U+FFA0.
逻辑换行和粘贴口径
CRLF 记为一次换行,CR、LF、NEL、LS、PS 也会换行;屏幕折行不计入。检测对象是浏览器交付的剪贴板文本,不恢复原始文件字节。新输入的换行使用 LF,位置也不代表原文件中的字节位置。
每类明确选择,改动才进入预览
没有默认清理项。特殊空格替换会失去原本的不换行等语义;删除控制符可能合并行或字段。连接符、变体选择符和方向标记可能关系到正常文字与表情,不能仅凭类别就认定应该删除。
长度上限与孤立代理
上限为 100,000 个 UTF-16 码元,超过后报错,不静默截断。孤立代理只报告、不修复;存在时禁用可能有损的文本复制与下载,仍可下载 JSON 报告,保留可复核的转义信息。

不可见字符检测常见问题

零宽空格是什么,为什么会让我的代码崩掉?

U+200B 零宽空格可以标记允许断行的位置。放进不接受它的代码位置时,解析器读到的就不再是眼睛看到的连续文本,可能报错。先核对码点及上下文,再决定是否移除,不能把所有代码错误都归因于它。

不可见字符就一定是坏东西吗?有没有正当用途?

有正当用途。ZWJ 能连接表情或文字,ZWNJ 能阻止特定连写,变体选择符可改变显示形式,NBSP 能保留不换行间距。检测不会自动删除;清理时应保留用途明确的类别。

不可见字符会不会被用来做坏事?

部分方向控制符能让显示顺序与存储顺序不同,也可能被用于混淆代码或文件名。本页标示这些字符及其位置,不判断攻击是否成立,更不能把没有发现字符当作安全证明。

「清理文本」是把所有不可见字符都删掉,还是只删某几类?

只处理你明确选择的类别。特殊空格替换为普通空格,其他选中类别删除;预览显示数量和前后文本,应用后才写回。没有选中的类别保留,孤立代理无论如何都只报告。

普通的空格和换行也会被标出来吗?

普通 ASCII 空格不报告。制表符和 CR、LF 等换行属于控制符,会列出供检查;这不表示它们异常。默认不选控制符清理,只有明确选择并应用时才会删除,因此务必先确认是否需要保留行列结构。

发现需要进一步核对的字符或位置?

回到待检查的片段

用不可见字符检测复现最小问题,先理解命中字符的用途,再决定保留、替换或删除对应类别。