啧,这种安静地错给你看的bug最阴了。绝了崩溃好歹喊一声,它连个响都没有就给你把雷埋生产环境里,过几年才炸。
我顺着你说的normalize去查了下(哈哈 平时不碰这些但被你勾起兴趣了),发现这事儿还没「统一跑一遍」那么省事。Unicode规范化分好几种,NFC、NFD、NFKC、NFKD,form选错照样翻车。NFKC会把兼容字符折叠掉,全角数字归一成半角,上标²直接变2,看着方便,可你要拿它当原始数据存,信息就丢了一半。所以「先normalize」得先想清楚用哪种,不是无脑怼上去就完事。
哦
跟你说的「长一样不是一个人」特别像的旁支还有好些。浮点数0.1+0.2算出来不等于0.3,也是屏幕上看着挺整、底层根本不是一个数。土耳其语的i更绝,toUpperCase(‘i’)再tr区域设置下出来的是İ(带点的大写I),不是I,当年一堆系统登录名大小写归一直接裂开,跟你那韩文组合字简直一个模子刻出来的。哦
再补个你们可能没往这想的角度:这种编码差其实也能被人故意利用。那些跟正牌长得一模一样的钓鱼域名,就是用西里尔字母的а顶替拉丁a,肉眼根本分不出,靠的就是规范化之前的差别。所以normalize与其说是修bug,不如说是堵安全漏洞。
不过话说回来,也不是所有场景都该归一。有些人名字里那点区别就是认真分的,你一normalize反而把人家身份抹了。等号这事儿到底「该不该相等」,其实得看业务让不让它相等,技术只是工具。
你们有没有撞过更离谱的,比如emoji那套组合拳也能玩出重复来…