简体中文

开发者工具·文本比较

看不见的差异:不间断空格、智能引号和 Unicode 形式

· 工作原理

文本差异 统一码 调试

视觉上相似的线块包含不同的隐藏字符形状
原始 ToolAcre 矢量图

解释了为什么屏幕上看起来相同的行可能逐字节不同,从不间断空格和大引号到零宽度字符和分解重音,以及如何找到它们。

两行看起来相同,但被标记为已更改 - 打开时会显示一个翻译文件,该文件因无明显原因而未能通过审核

平移线可以与其相邻线完全一样地渲染,但仍然无法进行比较。浏览器字体隐藏代码点边界、组合重音符号并将相似的形状分配给不同的标点符号。 ToolAcre 仅在选定的大小写或空格转换后比较 JavaScript 字符串,因此标记的行可以暴露真正的文本区别。

相信位置,而不是关于角色的假设。将可疑行复制到显示代码点的编辑器或十六进制检查器中。 diff 告诉您哪一行不同;它不注释内部位置或命名负责的 Unicode 值。

不间断空格及其亲属 — 解释 U+00A0 和文字处理器插入的其他空格字符以及为什么普通空格与它们不匹配

U+00A0 不间断空格与 U+0020 普通空格不是同一字符。在普通模式下,它们的线路键保持不同。在“忽略空白”下,空白运行替换可能会在修剪后将这些运行减少到普通空格,从而使一些此类差异消失。

该选项是匹配转换,而不是 Unicode 清理命令。显示的相等行保留原始左侧文本,并且不会生成更正的文档。如果发布系统需要不间断的间距,则规范化匹配可能会隐藏有意的布局指令而不是修复它。

空白模式可能会折叠 Unicode 空白;普通比较保留不同的字符

直撇号和引号与印刷的开头和结尾形式不同。忽略大小写不会更改标点符号,并且空格处理不会重写引号。因此,即使句子乍一看完全相同,文字处理器的自动更正功能也可以生成全行替换。

根据目的地选择所需的标点符号。源代码、搜索关键字和数据格式可能需要精确的 ASCII 字符,而编辑副本可能更喜欢印刷形式。比较证明了差异,但它没有确定哪一方是正确的政策。

零宽度和方向字符 — 涵盖零宽度空格、连接符和双向标记,这些标记呈现为无任何内容但仍会更改行

零宽度空格、连接符和方向标记可以占据字符串位置,而无需绘制可见的字形。 ToolAcre 使用文本内容呈现输入,避免 HTML 解释,但安全呈现不会使隐藏的代码点可见。他们仍然参与普通的排队平等。

定向行为也会使视觉顺序成为存储顺序的不可靠指南。不要仅仅因为可疑的混合方向片段看起来很熟悉而将其复制到 shell 命令或标识符中。在替换任何内容之前,请在专用工具中检查代码点和周围上下文。

组合和分解重音 — 解释 NFC 与 NFD 规范化(将重音字母作为一个代码点与基本字母加组合标记)

重音字符可以表示为一个预组合代码点或表示为后跟组合标记的基本字母。该存储库不包含对 `normalize` 的调用,因此规范等效的形式仍然是不同的 JavaScript 字符串,并且可以生成删除加添加行。

测试套件证明相同的 Unicode 字符串匹配,并且 `café` 与 `cafe` 不同;它不承诺进行字素感知比较。因此,本文避免了有关字节比较或完整 Unicode 等效性的声明。线路算法接收字符串并严格相等地比较它们转换后的键。

组合重音和分解重音仍然不同,因为该工具不执行 Unicode 标准化

假设资源行看起来未更改但已标记。首先与所有选项关闭进行比较,然后单独切换空白。如果行变得相等,则检查空格和隐藏的空白。如果它仍然发生变化,请检查引号,组合标记和其他代码点,而不是重复重新键入该行。

字符检查器可以显示 U+00A0 应该是普通空间的位置。确认格式要求后才可进行替换。在翻译内容中,不间断空格可能是故意的标点符号约定,而广泛的搜索和替换可能会损坏其他地方的正确排版。

这不包括什么——行不同的比较报告;它不会为您执行 Unicode 规范化或替换字符

文本差异不会规范 NFC 或 NFD、识别易混淆的内容、删除零宽度标记或生成修复的输出。它也不比较编码字节。这些是单独的操作,其后果是通用线路比较器不应该默默地选择。

忽略大小写使用 JavaScript `toLowerCase`,而忽略空格会修剪并压缩匹配的键。这两种操作均不提供区域设置感知排序规则或 Unicode 安全审查。使用输出来缩小调查范围,而不是证明标识符是安全的或语言上等效的。

要点:相信您的眼睛所看到的差异 — 得出的结论是标记的行是真正的差异,并展示了 ToolAcre 的文本比较如何精确定位要检查的行

当视线和差异不一致时,假设该字符串值得检查。该算法没有视觉模型,不会被字体整形所欺骗;它看到线路键。这种限制很有用,因为它可以防止隐藏的差异仅仅因为浏览器绘制相似而传递。

首先运行普通比较,记录哪个选项更改了结果,并在编辑之前检查代码点。该证据线索将空白规范化与标点符号或组成分开,并避免了用 ASCII 近似值替换每个不寻常字符的破坏性习惯。