toLowerCase与normalize的执行顺序是否会影响Unicode字符串处理?
当然存在这样的文本对!
答案是肯定的——确实有text1和text2能让这两个归一化函数的处理结果出现「一方相同、另一方不同」的情况。我给你举个具体的、可复现的例子:
- 设
text1 = "İ"(这是Unicode字符U+0130,土耳其语中带点的大写I) - 设
text2 = "I\u0307"(大写字母I,加上单独的点标记U+0307,也就是İ的NFD分解形式)
我们一步步拆解两个函数的处理结果:
先看normalize(text)(NFD分解 → 转小写)
- 处理
text1:"İ".normalize("NFD")会把预合成的İ拆成"I\u0307",接着.toLowerCase()把大写I转成小写i,最终得到"i\u0307"。 - 处理
text2:text2本身已经是NFD分解状态,.normalize("NFD")不会改动它,之后.toLowerCase()把大写I转成小写i,结果同样是"i\u0307"。
→ 此时normalize(text1) === normalize(text2),两者完全相同。
再看normalize1(text)(转小写 → NFD分解)
- 处理
text1:"İ".toLowerCase()会直接转为普通的小写"i"(JavaScript默认的toLowerCase对U+0130的处理规则就是转为U+0069),之后.normalize("NFD")对普通小写i没有分解效果,最终结果是"i"。 - 处理
text2:"I\u0307".toLowerCase()把大写I转成小写i,得到"i\u0307",接着.normalize("NFD")保持这个分解形式不变,结果是"i\u0307"。
→ 此时normalize1(text1) !== normalize1(text2),两者明显不同。
这个例子完美符合你描述的「一方相同另一方不同」的场景。反过来的情况(normalize结果不同但normalize1结果相同)也存在,比如调整一下文本对就能实现,但上面的例子已经足够证明存在性了。
内容的提问来源于stack exchange,提问作者Alexey Romanov
相关产品推荐
相关产品推荐

