姓与名的顺序与数量不固定
别名: 姓名顺序 · 多段姓名 · person name order
概念解释
地区感知姓名格式化(locale-aware person-name formatting)把若干姓名成分按姓名本身的语言与地区、显示语言和使用场景组合成可读名称。given + surname 不是普遍固定的两段式结构:一个人可能只有一个姓名成分,也可能有复合 given name、多个 surname 或其他成分;姓名顺序、分隔和省略方式也可能随引用、称呼、排序和长短格式改变。
机制
Unicode LDML Person Names 把姓名数据与显示 pattern 分开。调用方若明确请求 order=sorting,先选择排序 pattern;否则优先采用 PersonName 的 preferredOrder,再由 nameOrderLocales 与 nameLocale 推导 givenFirst 或 surnameFirst。选定顺序后,格式器再按 length、usage、formality 生成形式,并在字段缺失时清理相邻标点与空白。Formatting locale 选择初始 pattern 集,姓名自身的 locale 与文字系统还可能使算法切换或细化它,不能把显示 locale 当作唯一规则来源。
边界
排序名、索引键、法定全名、用户自选显示名和称呼名是不同产物,不能靠交换两个字符串互相生成。姓名所用文字可帮助格式器选择规则,但脚本无法可靠推断国籍、语言或个人偏好。转写版本也不是原文字形姓名的无损替代。若数据源只保存一个完整字符串,系统可以忠实显示,却不应凭空拆分;若只有分段数据,也应保留用户确认的完整显示形式以应对 pattern 无法覆盖的个案。
怎么落地
- 数据模型至少区分用户确认的完整显示名与可选结构化成分;在确有格式化需求时另存
nameLocale、首选顺序及原文字形/转写版本。 - 使用 CLDR/ICU Person Names 或等价的 locale pattern 生成引用、排序、简称和称呼形式,不以模板硬写
{given} {surname},也不靠字符串交换改顺序。 - 对缺 surname、缺 given、复合成分、无空格文字、多个 surname 和混合文字姓名逐一测试;检查字段缺失后是否残留逗号、句点或双空格。
- 让用户预览并修改最终显示名;通讯录、证件、证书等高后果输出在提交前显示完整结果,避免系统推断覆盖本人选择。