E2.08.2silent hard truncation设计研究
硬截断会静默丢失内容
别名: 输入截断 · maxlength clip · 超长被吃掉
概念解释
maxlength 一类硬截断在到达上限后拒绝再写入,多出来的字符直接消失:粘贴的后半段、语音识别多出来的词、输入法还在组的字,都可能被吃掉且没有任何说明。这叫静默硬截断(silent hard truncation)。人以为整段都进去了,提交的是残句。它管的是超限内容的命运,不是计数器何时出现,也不是按什么单位数。
机制
截断发生在键入通道上,不经过确认。剪贴板里 200 字、槽只收 140,后 60 字在粘贴事件里被丢掉,剪贴板本身还在,人不会去对。语音和 IME 的组写缓冲区更危险:候选还没上屏就被长度闸门丢掉,连「我打过」的记忆都弱。静默的条件是界面仍看起来正常——没有错误、没有「已达上限」、光标还在闪。人用「槽里看见的」当全部内容,残句就被当成完成品。硬闸门本意是保护后端长度;不告知时,保护变成数据丢失。
怎么研究
把长于上限的文本粘贴进硬截断槽,立即问「全部进去了吗」,并比对槽内与源串。自变量:是否弹出「已截断 N 字」、截断发生在粘贴还是逐键、IME 组写是否受闸。因变量:察觉率、提交残句率、事后能否从别处恢复。不要只测英文空格分词:中文、无空格语言的「少了几个字」更难看出来。日志里「平均长度刚好顶格」往往不是写满,而是大量粘贴被切。
边界
验证码、固定位数编号需要硬闸,多出来的位本来非法,静默仍不好,但丢失的不是可恢复的句子。后端硬限制无法取消时,前端至少要把「未写入的尾巴」留在一个可复制的地方。协作编辑里对方插入导致超限,截断会删掉不是自己写的字,责任更乱。撤销栈若把截断当成一次普通输入,Ctrl+Z 也找不回被吃掉的尾巴。
怎么落地
- 到达上限时停止写入,但立刻说明已满,并给出被拒绝的那一段(粘贴余量)供复制。
- 禁止把超长粘贴静默切成前 N 个单位;要么拒绝整段并保留剪贴板,要么收入前 N 个并弹出余量。
- 让撤销能回到截断前的意图,而不是只撤销最后一个合法字符。
- 验证:从别处复制一篇明显超长的文章贴进去,问人内容在不在。若答「在」而槽里是残句,就是静默丢失。再检查语音输入和中文组字。