【问题标题】:Does Java String.getBytes("UTF-8") preserve lexicograhpical order?Java String.getBytes("UTF-8") 是否保留词典顺序?
【发布时间】:2012-08-15 23:08:48
【问题描述】:

如果我有一个按字典顺序排列的 Java 字符串列表[s1,s2,s3,s4, ...., sn],然后使用 UTF-8 编码 bx = sx.getBytes("UTF-8") 将每个字符串转换为字节数组,那么字节数组列表 [b1,b2,b3,...bn] 是否也按字典顺序排序?

【问题讨论】:

  • 由于 UTF-8 是可变宽度编码,所以我会说不会保留排序顺序
  • 我不确定你的问题是否有意义;您将如何按字典顺序对位/字节进行排序?您将这些位/字节映射到的字符集是决定因素。
  • @Brian Roach 字节数组上的字典顺序与字符串上的相似。只需将“x 处的字符”替换为“x 处的字节”即可。参见例如stackoverflow.com/questions/5108091/…
  • @Dmitry 不一定。我不需要比较所有字节,只需要比较第一个差异。由于 UTF-8 是可逆的,因此 2 个字符的第一个长度差异应该意味着它们编码的字节数不同。但是,我不确定这是否足以维持秩序。
  • @DmitryBeransky:但 UTF-8 是专门为保留排序顺序而设计的。

标签: java sorting utf-8 arrays lexicographic


【解决方案1】:

是的。根据RFC 3239

UTF-8 字符串的字节值字典排序顺序是 就像按字符编号排序一样。当然这是 兴趣有限,因为基于字符数的排序顺序是 几乎从不具有文化意义。

正如 Ian Roberts 所指出的,这适用于“true UTF-8(例如 String.getBytes 会给你)”,但要注意 DataInputStream's fake UTF-8,它将排序 [U+000000 ] 在 [U+000001] 之后和 [U+00F000] 在 [U+10FFFF] 之后。

【讨论】:

  • 为了完整起见,请注意这对于 true UTF-8 是正确的(例如 String.getBytes 会给你),但不一定适用于所使用的“modified UTF-8DataInputStream 和朋友们。
  • @IanRoberts:对。实际上,修改后的 UTF-8 将 [U+000000] 排序在 [U+000001] 之后,将 [U+00F000] 排序在 [U+10FFFF] 之后。
  • 你确定这个答案是正确的吗?基于 UTF-16 而不是 Unicode 代码点的字符串的正常 Java 字典顺序不是吗?
【解决方案2】:

您会在给定的顺序中获得对象 X 的列表/数组。

您创建一个此类对象的新列表/数组 Y,并应用一个方法。

Y 将具有您创建它的顺序(通常您将保持 X 顺序)。不会发生重新排序。

此外,byte[] 的字典顺序是没有意义的。

【讨论】:

猜你喜欢
  • 2016-02-14
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2016-09-12
  • 2016-04-25
  • 2010-10-14
相关资源
最近更新 更多