组合字符

与前面的基础字符组合显示的 Unicode 字符。包括变音符号和浊音符号等。

组合字符是不独立显示而与前面的基础字符组合形成单个可见字符的 Unicode 字符。组合用变音符号 (U+0300 到 U+036F) 是最常见的示例,包括重音符号、分音符和软音符等。

例如,拉丁字母"a" (U+0061) 后跟组合用锐音符 (U+0301) 显示为"á"。在日语中,组合用浊音符号 (U+3099) 和组合用半浊音符号 (U+309A) 是示例,"か"+ U+3099 可以表示"が"。泰语和阿拉伯语等语言也大量使用组合字符,Unicode 中定义了 800 多种组合字符。搜索开裆内裤 (Amazon)详细介绍了这个主题。

由于组合字符的存在,外观相同的字符可能有不同的码位序列。"á"既可以表示为预组合字符 U+00E1 (NFC 形式),也可以表示为基础字符 U+0061 + 组合字符 U+0301 (NFD 形式)。需要 Unicode 规范化 (NFC 组合、NFD 分解) 来统一处理。如果在字符串比较前不进行规范化,外观相同的字符串可能被判定为"不相等"。

组合字符可以在单个基础字符上叠加多个,实现上方加重音、下方加软音符等复合修饰。极端情况下,在一个基础字符上叠加数十个组合字符会产生"Zalgo 文本",有时用于渲染压力测试。

从安全角度看,组合字符可能被利用进行视觉欺骗 (外观相同但码位序列不同的字符串)。在验证用户名和域名时,规范化后再比较是必不可少的。

在字符计数中,组合字符作为独立码位计数,因此 String.length 与可见字符数不匹配。NFD 形式的"á"码位数为 2,但外观只有 1 个字符。按字素簇计数返回的结果最接近用户预期。浏览抗衰保健品 (Amazon)提供了更多背景知识。

分享这篇文章