LVGL文本输入框:UTF-8光标、输入校验与密码处理

移动光标前,先确定索引单位

输入框处理ASCII正常,输入中文姓名后却删错字符,常见原因是把UTF-8字节偏移和字符位置混用。本文采用LVGL 9.2文档及v9.2.2源码,讨论编辑和校验策略。字体覆盖、文字整形及完整操作系统输入法属于其他能力,必须针对平台分别确认。

v9.2.2文本框头文件将光标位置定义为字符索引。C字符串的字节长度不能直接当作该索引。例如“A中B”包含三个Unicode码点,但UTF-8编码占五个字节。在“中”的编码内部移动一个字节,并没有到达合法字符边界。保留原始编码字符串,需要对接字节偏移接口时,再使用理解编码的转换。

UTF-8输入按字符索引编辑,复制稳定候选值后独立校验;密码遮罩属于另一个展示问题。
原创工程概念图,表达设计依赖,不代表已经实测的实现。

码点数量也不一定等于视觉字符数

一个字母加组合重音可能占多个码点,却看起来是一个字符;表情序列还可能更复杂。不能因为基本汉字编辑正常,就宣称支持按字素簇编辑。应明确产品允许的输入集合,并根据这个承诺检查移动、选择和删除行为,而不是把所有Unicode能力视为一个开关。

受约束的工业字段可以支持文档规定的名称和符号集合;如果允许自由个人文本,则需更广泛的Unicode测试。外部输入包含非法UTF-8时,应在进入模型前拒绝或按规则替换。处理字节容量不足,不能直接在多字节序列中间截断。存储字节容量、界面字符上限和后端字段限制也应分别管理。

一致使用控件编辑接口

9.2文本框说明提供lv_textarea_add_text()、lv_textarea_delete_char()、lv_textarea_delete_char_forward()及光标移动接口。插入多字节文本时使用UTF-8字符串,不要假定普通C字符字面量能够表达所有输入。在同一个光标位置,删除左侧字符和删除右侧字符含义不同,开头与结尾都要验证。

选择文本还会引入额外状态,随后插入内容如何与选区交互,应按实际配置检查。明确启用选择,并分别测试拖动、键盘和程序修改。不要保存lv_textarea_get_text()返回指针,然后在后续修改之后仍假定它稳定。其他子系统若需异步使用文本,应复制经过容量约束的快照,并由接收方拥有该存储。

输入过滤与业务校验分开

允许字符列表和最大长度有助于约束输入,却不能证明完整值有业务意义。允许数字、正负号和小数点,不代表“–1..2”是合法数字。数值字段需要语法、范围、单位,以及对编辑中间状态的规则。用户键入时暂时只有负号可以被允许,但提交时必须拒绝不完整值。

使用LV_EVENT_INSERT处理插入决策,用LV_EVENT_VALUE_CHANGED响应内容变化。通过lv_textarea_set_insert_replace()替换即将插入的文字时,替换字符串必须在回调返回后继续有效,不能指向已经结束的局部数组。更新内容引发再次事件时,应有防递归措施或分离清楚的模型更新路径。提交设备设置或后端之前,应用应验证完整候选值,包括程序赋值而非键盘输入的内容。

不把单条注释当作运行保证

核对set_text、允许字符和最大长度如何协作时,v9.2.2实际实现尤其重要。头文件注释与高层示例不能替代对当前配置路径的测试,密码模式同时开启时更应如此。业务模型应拥有独立校验,避免控件行为差异悄悄改变最终接受的配置。

把校验结果与显示文字分开记录。提交时使用同一份已经验证的快照完成解析和应用,不要先验证一个指针,之后又在别的事件发生后重新读取文本。错误信息应说明字段和允许范围,并进行本地化,同时尽量保留有用输入。小数分隔符、空白规范化等格式规则,要与接收系统一致且确定,不能随意猜测用户意图。

密码圆点并不保护底层秘密

lv_textarea_set_password_mode()只改变视觉展示,lv_textarea_get_text()仍返回实际输入值。因此即使屏幕显示圆点,调试日志、界面模型转储或复制缓冲区仍可能泄露密码。应规定谁能读取、何时清除,以及刚输入字符显示多久。文本控件不是加密存储,也不是凭证保险箱。

校验日志不要记录原始内容,拒绝的输入也一样。减少外围应用中的复制与驻留时间,审查平台是否具备所需安全存储和传输。清空控件不能被宣传为已经安全擦除所有旧分配块和诊断缓冲区。安全结论需要独立证据,不能由界面遮罩推导。

建立编辑测试矩阵

建议覆盖ASCII、“A中B”、组合字符、允许符号、不支持序列、非法外部编码及最大合法值。逐个边界移动和删除,替换选区,粘贴多字符,并通过程序设置文本。检查编码结果、光标索引、字符上限、后端字节上限和最终解析值,不能只观察屏幕看起来是否正确。

密码测试使用合成数据并关闭内容诊断,确认报告不捕获真实凭证。还要核实平台键盘和输入法真正提供什么能力,能显示中文不等于支持中文组合输入。本文没有执行模拟器、输入法或设备安全测试。验收需要编辑行为正确、业务值有效,并明确Unicode及秘密处理的能力边界。

类似文章