首页/开发/正则与编码速查/Unicode 排序规则与区域差异

Unicode 排序规则与区域差异

Unicode 排序不是单纯的码点大小比较:标准排序算法先把字符串映射成多级权重(主权重管字母、次权重管重音、三级管大小写),再逐级比较,并按语言做顺序调整,所以排序应使用 collation 实现而不是字符串比较。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

多级权重与语言调整

Unicode 排序算法把每个字符映射为一组排序权重:主权重决定基础字母顺序(忽略重音与大小写),次权重解决重音差异,三级权重解决大小写差异,必要时还有更细一级处理标点与变体。比较时从高到低逐级判断,因而既能得到「a 与 á 相邻」的结果,也能支持忽略大小写的排序。此外每种语言可以按自身习惯调整权重:德语对 ä 的处理、瑞典语把 å 与 ö 排在字母表末尾、中文按拼音或笔画排序都属于语言相关规则。

基本信息

比较层次主权重、次权重、三级权重,逐级比较
主权重决定基础字母顺序,忽略重音与大小写
次权重 / 三级权重分别处理重音差异与大小写差异
语言调整各语言可自定义顺序,如中文拼音序与笔画序
常用实现ICU Collator、语言库的 collation、数据库 collation
排序键可预先计算并缓存,用于批量排序与索引

典型使用场景

  • 通讯录与名单排序:中文按拼音或笔画,欧洲语言按本地习惯排列
  • 数据库排序:ORDER BY 受列的 collation 影响,只改字符集不够
  • 去重与分组:折叠大小写与重音后归组,需要排序规则配合
  • 搜索建议:候选词按语言习惯排序,避免违背直觉的顺序
  • 跨系统一致性:两端排序结果不同时,需明确各自使用的排序规则

排序示例

排序示例
# 码点排序与语言排序的差异:大写字母会排在所有小写字母之前
python -c "print(sorted(['b','A','a','B']))"                          # 码点序:A B a b
python -c "print(sorted(['b','A','a','B'], key=str.casefold))"          # 忽略大小写的近似排序
# PyICU 用法示意:collator = icu.Collator.createInstance(icu.Locale('zh'))
#                  words.sort(key=collator.getSortKey)
# 未安装 PyICU 时可用数据库 COLLATE 或前端 Intl.Collator 兜底
# SQL 示例:SELECT name FROM t ORDER BY name COLLATE utf8mb4_zh_0900_as_cs;

语言差异示例

语言差异点结果
德语ä 有字典序与电话簿序两类处理ä 可能等同 ae,也可能紧随 a
瑞典语å ä ö 排在字母表末尾与英语顺序明显不同
中文拼音序与笔画序并行同一组汉字的两种顺序完全不同
丹麦语部分字母被视为独立字母与邻国语言顺序不同
码点序仅按码点数值比较大写先于小写,重音字符脱离基字母
数据库的 collation 决定三件事:排序顺序、相等判断与索引行为。大小写不敏感的 collation 会让仅大小写不同的值判定为相等,从而影响唯一约束;修改 collation 会影响既有索引与业务语义,需评估后执行。
用字符串比较代替排序规则会产生「看起来没规律」的顺序:大写字母集中在小写之前、重音字符被排到远处、中文按码点乱序。对外展示的列表必须使用语言相关排序,中文场景至少要明确拼音或笔画。
排序键可以缓存:批量排序大量数据时,为每条记录预先计算排序键能降低重复比较成本;但排序键依赖排序规则版本,规则升级后需要重建,变更前应评估影响范围。

易错点

  • 直接按码点排序:大写集中、重音分散、中文乱序,用户看不出规律 → 使用 collation 实现
  • 忽略数据库排序规则:ORDER BY 结果与预期不符,唯一约束行为也可能不同 → 明确列的 collation 并统一
  • 不同系统使用不同规则:同一批数据两端顺序不同,被误判为数据错乱 → 约定排序规则与版本
  • 以为忽略大小写排序就是把内容统一小写:转换改变内容且不可逆 → 用排序规则的多级权重,不改动原始数据
  • 排序键不随规则升级重建:新旧规则混用导致顺序不一致 → 规则变更时同步重建缓存

数据来源与参考

  • Unicode 官方:Unicode Collation Algorithm(UCA)与 DUCET
  • Unicode 官方:Locale 数据与排序定制说明
  • ICU 官方文档:Collator 与排序键

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/unicode-sort-order-rules.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​