XPath translate()函数对Unicode分解/合成字符的处理行为咨询
问题解答
现象是否符合预期?
完全符合预期。
相关规范说明
XPath(XSLT基于XPath规范)的字符串处理函数(包括translate())默认基于Unicode码点进行精确匹配,不会自动对字符串进行Unicode规范化(比如将分解形式的é转换为合成形式,或反之)。
具体到你的场景:
- 合成形式的é是单个Unicode码点
U+00E9,而分解形式的é是两个码点的组合:U+0065(小写字母e) +U+0301(组合重音符号),二者在Unicode中属于不同的字符序列。 translate()函数的匹配逻辑是逐个对比码点:- 第一次调用时,
$from参数包含分解形式的é(两个码点)加上abc,输入字符串中的a会匹配到$from中的a码点,由于$to参数长度短于$from,导致该字符被删除,最终输出bc; - 第二次调用时,
$from参数中的é是单个码点U+00E9,输入字符串的a、b、c都无法匹配到该码点,因此全部保留,输出abc。
- 第一次调用时,
如果需要让两种形式的é得到一致的处理结果,可以显式使用normalize-unicode()函数将字符串统一为相同的规范化形式(比如NFC或NFD),示例如下:
translate('abc', normalize-unicode('éabc'), 'eabc')
内容的提问来源于stack exchange,提问作者wasmachien
相关产品推荐
相关产品推荐

