【问题标题】:Can Java ever be based on UTF-8, like 'Go' is? [closed]Java 可以像“Go”那样基于 UTF-8 吗? [关闭]
【发布时间】:2015-08-03 08:47:17
【问题描述】:

Java 目前是原生 UTF-16。我知道有一些方法可以转换为 UTF-8。

由于 Unix 已经基于 UTF-8(仅引用它,因为 Java 主要在 'nix 上运行),Java 进入 UTF-8 领域有多么困难,就像世界其他地方一样为了提高效率?

这会涉及到语言的完全重写吗?

【问题讨论】:

  • 或许你应该在Java bug report 上发帖,让大家评估一下。
  • 不,我会让这里的触发者快乐的人对他们无法理解的东西投反对票。(这与我的用户名不符,我知道 :) - 但你只是在开玩笑,不是吗 - 这个还不是真正的错误(还)
  • 正如您在@Tagir 帖子中看到的,有一个错误报告。再说一次,虽然我没有投票反对也没有投票结束这个问题,但我认为这不是讨论任何事情的地方,而是发布一个具有特定答案的编程问题。
  • 好吧,因为我无法回答“保留”的问题,我发现 Java 8 是高性能 ISO 8859-1,它接近 UTF-8,除了它包含第一个256 Unicode 无论如何都很重要。

标签: java utf-8


【解决方案1】:

UTF-8 的问题在于您无法以 O(1) 的性能实现 charAt 方法。世界上有很多代码都依赖于此。比如:

for(int i=0; i<string.length(); i++) {
    char c = string.charAt(i);
    ...
}

如果你切换到 UTF-8,寻找第 i 个字符将是 O(n),因此这样的代码将变成 O(n^2),这可能会成为性能灾难。

至于效率,有一个提议在 Java 中恢复 compressed strings:仅由 ASCII-7 字符组成的字符串可以存储在 byte[] 数组中。据我所知,该功能正在积极开发中,很有可能它将包含在 JDK9 中。

【讨论】:

  • 你提到的问题,是否也适用于 ASCII 字符?
  • 不。将有两种字符串表示形式:每个符号 1 个字节(如果所有符号都是 Latin-1)和每个符号 2 个字节(对于所有其他情况)。在这两种表示中,您都可以快速获得第 i 个符号。在 UTF-8 中,您可以混合使用 1-2-3 等。同一字符串中每个符号的字节数,因此您实际上需要检查所有先前的符号。
  • Go 是如何克服这个问题的
  • 我不是围棋专家,但似乎他们没有按位置随机访问的方法。只有顺序迭代是可能的。毕竟他们没有像 Java 那样的大量遗留代码。
  • 那么我可以认为你的答案是 Java 永远不会因为这个(或任何其他原因)切换到 UTF-8 吗?
猜你喜欢
  • 2017-02-13
  • 2020-07-28
  • 2018-02-04
  • 2021-09-09
  • 1970-01-01
  • 2014-03-16
  • 2011-06-30
  • 2012-08-01
  • 2012-06-15
相关资源
最近更新 更多