Java中CollationKey调用toByteArray()的输出结果该如何解读
为什么CollationKey的toByteArray()输出和原始字符串二进制无关
你遇到的预期错位,本质是对CollationKey的设计目标理解偏差:这个方法返回的从来不是字符串本身的编码字节,而是一套为字符串排序优化生成的权重编码。你期望拿到的字符串二进制位表示,完全不在这个方法的设计范围内。
示例输出
[0, 83, 0, 0, 0, 1, 0, 0, 0, 1]的解读逻辑 Java的CollationKey二进制格式基于Unicode排序规则(UCA)设计,采用分层权重结构编码,各段字节的作用完全服务于“快速排序比较”的核心目标,不存在和原字符串直接对应的映射关系:
- 穿插在字节序列里的
0是不同权重块的分隔符,用来区隔不同优先级的排序维度 - 序列开头的
0, 83是大端序存储的一级排序权重值(十六进制0x0053,对应十进制83),代表字符a在排序序列中的基础顺位——这是排序时优先级最高的比较项,这个值和字符本身的ASCII编码(97)没有关联,是排序规则预先定义好的权重值 - 后续的
0, 0, 0, 1是大端序存储的二级排序权重值,主要用来区分大小写、字符重音这类中优先级的差异;最后一段0, 1是大端序存储的三级排序权重值,用来区分更细粒度的字符差异。因为纯小写无重音的a没有特殊的区分属性,这两个层级的权重都是默认最低值1
实际使用的注意事项
- 如果你需要获取字符串对应的原始二进制表示,直接调用
"a".getBytes()即可,完全不需要借助CollationKey的链路 - CollationKey字节序列的唯一合法用途,是支持高效的批量排序比较:只要是同一个Collator实例生成的Key,直接对两个Key的byte数组做字典序比较,就能得到和原字符串调用
Collator.compare()完全一致的排序结果,性能远高于反复对原字符串执行排序规则计算 - 不要尝试通过
toByteArray()的输出反推原始字符串:这个二进制结构是JDK的内部实现细节,不同JDK版本、不同语言环境(Locale)下,同一个字符串生成的字节序列可能发生变化,官方也没有提供公开的解码接口还原原串
内容的提问来源于stack exchange,提问作者kamilP
相关产品推荐
相关产品推荐

