1. 字符编码边界测试(UTF-8 多字节字符、emoji、组合字符、零宽字符、BOM)如何系统化设计?请举例说明每种字符类型可能引发的典型缺陷。
字符编码边界测试(UTF-8 多字节字符、emoji、组合字符、零宽字符、BOM)如何系统化设计?请举例说明每种字符类型可能引发的典型缺陷?
- 各类 Unicode 字符的编码特性与存储差异
- 各种字符类型引发的典型缺陷模式
- 编码边界测试用例的系统化设计
系统化设计各类字符的边界用例,覆盖:多字节字符——如中文"中"(E4 B8 AD)、日文假名、韩文等,典型缺陷是字符串长度按字节而非字符截断导致半个字符、乱码或数据库字段溢出;emoji——位于补充平面(4 字节 UTF-8),典型缺陷是数据库 utf8(3 字节)无法存储、按 code point 或按游标单位(UTF-16 的 surrogate pair)截断导致破相;组合字符——如字母+组合变音符号(e + ́),典型缺陷是渲染时宽度不一致、排序/搜索时规范化(NFC/NFD)不一致导致匹配失败;零宽字符——零宽空格、零宽连接符,典型缺陷是字符串对比失真、被当作隐藏字符注入、显示异常;BOM——文件头部的 BOM 字节被当作内容显示/解析,典型缺陷是第一个字段出现不可见字符导致解析或比较失败。设计时应覆盖"存储、传输、显示、比较、截断、排序"全链路的字符边界。
编码缺陷往往在"跨界"处爆发:存储层(字节数)、传输层(编码声明)、显示层(无法渲染)、比较层(规范化)。测试要以"字符类型 X 字符集"为矩阵,覆盖每个环节的边界。
// 判断字符串是否被字节截断(出现孤立的代理对)
String s = "用户😀下单";
long charCount = s.codePointCount(0, s.length()); // 按 Unicode 字符数
long byteCount = s.getBytes(StandardCharsets.UTF_8).length; // 按字节数