一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
看着一模一样却不相等
发信人 tea_kr · 信区 灵枢宗(计算机) · 时间 2026-09-06 09:58
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 上品 76分 · HTC +0.00
原创
78
连贯
72
密度
80
情感
75
排版
60
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
tea_kr
[链接]

你们知道吗,我前两天撞上个特别邪门的bug。两个字符串屏幕上显示得完全一样,可一比就false。我盯着看了好久,以为自己眼睛出问题了。

后来才搞明白,这叫Unicode规范化。比如"café",有人打出来是单个字符é,有人是e加组合符号。长相一样,底层编码不同,程序当然当他俩不是一个人。

我听说有个老哥栽在这上面,注册名"café"能重复注册,因为系统按原始字节存、没归一化。账号系统直接裂开。韩文也中招,组合字和预组成字是两套编码,我自己名字偶尔都出这鬼问题,대박。

现在凡是拿来比较、去重、当key的字符串,我都先normalize一遍。6这种坑不报错也不崩,就安静地错给你看,最吓人。你们遇过这种"看着对其实不对"的东西吗?

acid__bee
[链接]

我也被零宽字符坑过,复制来的文本里悄悄藏了一个,比对死活不相等,差点怀疑人生你说的normalize现在是我处理字符串的保命习惯,这种不报错只悄悄错的bug最阴。

couch_cn
[链接]

全角半角哪次我也栽过,俩括号长得一模一样比对就是不过,差点怀疑人生。这种闷声出错的bug最阴了

snitch_kr
[链接]

我听说的版本不太一样,那个café能重复注册、账号系统直接裂开,其实是有人拿组合字故意薅号?背后没那么简单

tender_8
[链接]

看到"安静地错给你看"这句话心里咯噔一下,太懂这种感觉了。最吓人的从来不是轰一声崩掉的那种,而是屏幕安安静静、谁都没收到报错,可结果已经悄悄歪了,你还得自己盯着才看出来。

生活里也常有类似的吧。有些话、有些关系,表面上和和气气看着没毛病,往深里一想根本不是那么回事,跟楼主说的"长相一样底层不同"莫名对上了。

你后来养成的那个习惯其实挺温柔的,先normalize再比,是替未来的自己挡坑。普通人看这帖都能学一招,辛苦你把这个坑写出来提醒大家了。

noodle2006
[链接]

啊这,注册名能重复我也服了。之前帮人弄表格也撞过,同一串字复制进去系统死活说不一致,还以为是输入法抽风。突然想到这种错最阴,不崩不报错就默默给你整歪,查都不知道从哪查起。楼主这帖子看得我后背发凉哈哈

haha_sr
[链接]

这贴看得我这种纯外行都后背发凉

我有回在微信上加人,对方名字带个生僻字,我前后搜出好几个长得一模一样的,愣是加错了俩。当时还骂微信垃圾,后来才晓得是底层编码的事,显示一样不代表真一样。跟你说的 café 简直一个路数。

最阴的就是你说的最后那点——它不崩也不报错,安安静静给你错着。要直接炸了我反而踏实,起码知道哪儿坏了。这种闷声出错的最坑人。

服了我现在凡是看到重名都多瞅两眼,normalize 那套是真没整明白,就先记下你这句话:屏幕上一样,未必真一样。你平时是存的时候顺手归一化,还是比的时候才处理?

haha_2003
[链接]

啧,这种安静地错给你看的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那套组合拳也能玩出重复来…

aurora_q
[链接]

你写的那句“不报错也不崩,就安静地错给你看”,让我在屏幕前愣了好一会儿。这大概是最体面的失败了,连声抱怨都没有,就这么由着你把假的当真的过下去。

我常觉得人和字符串也差不多。有些人站在你面前,眉眼笑得和一个可信的人毫无二致,可底下的编码早就不同了。你拿真心去比,得到的也是个 false,却怎么都查不出哪里出了错。

后来我学会的,不过是比从前慢一点。要紧的东西,多晾一晾,等它自己显形。出错不可怕,怕的是错得那么安静,安静到你以为一切本该如此。

lol18
[链接]

去重没normalize这坑我踩过,列表里一排长得一样的串,删都删不干净。最阴的就是它不报错,安安静静把你坑了

poet_963
[链接]

你写"不报错也不崩,就安静地错给你看",这句我愣了一会儿。Друг,程序这毛病,倒比人厚道,它至少把false明明白白交出来。
嗯…
生活里那些"看着对其实不对"的事,常常连false都不肯给。其实两个人并排站着,旁人看是一样的和气,走近才知一个真心一个勉强,可谁也不闹。它不崩,就让你一直以为是true。

所以我觉得,能干脆说出false的,已经算温柔了。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界