有一次我在线上Trados(Trados Online Editor)检查译者作业情况,执行QA检查后得到了几条报错提示,都涉及Tag不一致,例如:
Source:
The device must be configured with the new part through <ph id="1092" x="</span>">{1092}</ph><ph id="1093" x="<span index="1">">{1093}</ph><ph id="1094" x="<a href="">{1094}</ph>111487<ph id="1095" x="">">{1095}</ph>System Configuration in AST 2<ph id="1096" x="</a>">{1096}</ph><ph id="1097" x="</span>">{1097}</ph><ph id="1098" x="<span index="2">">{1098}</ph>.<ph id="1099" x="</span>">{1099}</ph>
Target:
裝置必須透過 <ph id="1092" x=”</span>”>{1092}</ph><ph id="1093" x="<span index="1">">{1093}</ph><ph id="1094" x="<a href="">{1094}</ph>111487<ph id="1095" x="">">{1095}</ph>AST 2 中的「系統配置」<ph id="1096" x="</a>">{1096}</ph><ph id="1097" x="</span>">{1097}</ph><ph id="1098" x="<span index="2">">{1098}</ph>來配置新零件。<ph id="1099" x="</span>">{1099}</ph>
对比可以发现:
原文的 x=”</span>” 变成了 x=”</span>”。 (修改部分我已经用红色标记出来。)
如果不熟悉代码结构,可能就以为这条报错确实是对的,需要修改Tag。但其实这不是错误——Trados为了避免XML/HTML文件的结构被破坏,刻意将 < 转义为 <,将 > 转义为 >。所谓转义(escape),就是将内容设定为文本从而避免解析器将该内容识别为代码。在HTML语言里,小于号(<)是标签的开始,而大于号(>)是标签的结束,只有当解析器连续读取到一个小于号跟一个大于号时,才能成功解析;如果连续读取到两个小于号或大于号,就会读取失败,导致文件内容无法正常显示。
为了方便读者理解,我便举两个例子:
- <span>text</span>
- <text>HP < 50</text>
在例1中,<span>和</span>都是配对的标签符,text是文本,由于<和>成对出现,解析器能正常识别内容,也就是说它能读取text。然而,由于解析器无法自动判断<和>是否不是标签符号,在例2中,解析器就无法读取HP < 50。解析器看到 HP < 50 里的 < 后,以为之后一定要出现配对的标签符,也就是说应该出现 >content</50> 。然而,后面的内容却是 </text>,根本无法与 <50 凑成标签对。此外,HTML的标签不能以数字开头。于是乎,解析器宕机了。
如果读者还是不好理解,我们可以想象一个场景。
HTML解析器是只会按照规矩办事的机器人。它必须遵循以下规则:
- 看到没转义的 < 和 > 时,必须将其理解为标签符
- 标签符必须成对出现,< 要搭配 >,<>要搭配</>
- 标签符不能以数字开头
现在,让我们看看这个机器人是怎么思考的。
嗯哼,代码是<text>HP < 50</text>。<text>是标签符,接着是文本 HP,然后是 <,从这开始应该是标签符。等等,为什么接着出现的是 数字50?为什么50之后是< ?明明 < 没有转义,就应该理解为标签符,但之后为啥没有配对的 >?为什么以数字作为标签符名字开头?理解不能!!!
看完模拟场景是不是就理解了?那怎样才能避免解析器将文本里的<和>识别为标签符的一部分呢?那就是使用转义符号。在HTML语言里,如果需要转义,以 & 为起始符号,; 为终止符号,另外,< 要改为lt(即less than的缩写),> 要改为gt(即greater than的缩写)。
让我们回到例2,将 < 转义,那么能被解析器正常读取的代码是:
<text>HP < 50</text>
最终的输出结果是:
HP < 50
评论区