SuperAPI AI 工具集

cjk-text-and-input

前端与建站

查看项目

更新于 10-16 09:30

技能介绍

用途:定位和修复两类英文单语测试无法发现的东亚文字前端缺陷——CJK 断行与 IME 输入法组合,同时覆盖用户感知字符的计数与安全截断。

主要能力: 换行。CJK 默认几乎可在任意两字之间断行(UAX #14 表意类;韩文常按空格定制)。韩文用 word-break: keep-all 避免词内断开(MDN),并以 overflow-wrap: break-word 处理 URL 等长不可断串;word-break: break-all 用于非 CJK 文本的两字间断行以防溢出(对 CJK 行为不变),不要用于混合语言正文;line-break: strict|loose 调整日/中文标点旁的禁则换行,不控制韩文词完整性。标题、按钮需用真实韩文文案测试。参考 W3C klreq。

IME 组合。IME 跨多次击键组合文本,DOM 触发 compositionstart → compositionupdate* → compositionend(MDN CompositionEvent)。组合期间按键事件不可靠:keydown 的 KeyboardEvent.isComposing === true,旧引擎报告 keyCode 229(UI Events 规范)。经典缺陷:Enter 提交 IME 缓冲的同时触发表单 Enter 处理器,提交半成品文本。守卫写法: input.addEventListener('keydown', (e) => { if (e.isComposing || e.keyCode === 229) return; // IME is composing — not a command if (e.key === 'Enter') submit(); }); 受控输入(React 等)在组合期间对每次 change 做转换/过滤会破坏组合缓冲(字符重复或拆分),应在 compositionend 或 blur 时再执行清洗/大写/掩码。搜索联想:每次组合更新都产生部分音节的 input 事件,仅防抖仍会查询垃圾中间态,应以 compositionend 为门控(并为非 IME 输入保留常规路径)。浏览器在 compositionend 与最后一次 input 事件顺序上有差异,应依据 event.isComposing 分支而非事件顺序。

计数与截断。String.length 计的是 UTF-16 码元而非用户感知字符:NFC 下韩文音节为 1,分解的字母为 2–3(NFD;macOS HFS+ 时代的文件名也如此),emoji 为 2+。面向用户的长度限制与光标安全截断应使用 Intl.Segmenter 的字素粒度,并在比较混合来源字符串前 .normalize('NFC')。对 Intl.Segmenter 需特性检测,旧 WebView/浏览器回退到经验证的字素拆分库,或采用“输入后校验、不中途截断”的保守策略。

适用场景:CJK 界面、受控输入框、搜索联想、表单快捷键、字符计数限制、多语言混合 UI。

限制:不负责更广的多语言文案层(文本膨胀撑破布局、CLDR 复数、Intl 数字/日期/货币格式化、RTL 与 lang/dir 标记),那属于 i18n-copy-and-layout。提交问题需有真实 CJK 字符串或 IME 序列并造成用户可见失败,以及最小化的原生输入或渲染文本回归;弱发现(仅把 keyCode 229 当兼容守卫、对协议字节或内部标识用 String.length、无 CJK 复现的窄容器)应拒绝。具体支持的浏览器或 WebView 矩阵、发布时间与价格暂未提供。