为什么charset名称不是常量?

ser*_*erg 209 java character-encoding

Charset问题本身令人困惑和复杂,但最重要的是你必须记住你的charsets的确切名称.是"utf8"吗?还是"utf-8"?或许"UTF-8"?在互联网上搜索代码示例时,您将看到以上所有内容.为什么不将它们命名为常量并使用Charset.UTF8

Kev*_*ion 158

问题的简单答案是可用的字符串字符串因平台而异.

但是,有六个必须存在,所以很久以前就可以做出常数.我不知道他们为什么不是.

JDK 1.4通过引入Charset类型做了很棒的事情.此时,他们不再需要提供String常量,因为目标是让每个人都使用Charset实例.那么为什么不提供六个标准的Charset常量呢?我问Martin Buchholz,因为他碰巧坐在我旁边,他说没有一个特别好的理由,除了当时的事情仍然是半生不熟的 - 很少有JDK API被改装成接受Charset,以及那些,Charset超载通常表现稍差.

令人遗憾的是,只有在JDK 1.6中,他们终于完成了装配Charset重载的所有装备.并且这种向后的性能状况仍然存在(之所以令人难以置信的奇怪,我无法解释它,但与安全性有关!).

长话短说 - 只需定义自己的常量,或者使用Tony小马链接到的Guava的Charsets类(尽管该库实际上尚未发布).

更新:一个StandardCharsets类在JDK 7中.

  • 不公平!您可以访问这些优秀的资源.=(我看到你曾经说过的另一个答案,"是的,所以我问Josh [Bloch]这个......" (7认同)

Eti*_*veu 101

两年后,Java 7的StandardCharsets现在定义了6个标准字符集的常量.

如果你坚持Java 5/6,你可以使用Guava的Charsets常量,正如Kevin Bourrillion和Jon Skeet所建议的那样.


Jon*_*eet 29

我认为我们可以做得更好......为什么不能直接访问保证可用的字符集?Charset.UTF8应该是对Charset字符串的引用,而不是字符串的名称.这样我们就不必处​​理UnsupportedEncodingException所有地方了.

请注意,我也认为.NET通过在任何地方默认使用UTF-8来选择更好的策略.然后通过简单地命名"操作系统默认"编码属性搞砸了Encoding.Default- 这不是 .NET本身的默认值:(

回到关于Java的charset支持的咆哮 - 为什么没有一个构造函数FileWriter/ FileReader哪个需要Charset?基本上由于这种限制,这几乎是无用的类 - 你几乎总是需要InputStreamReader一个FileInputStream或相当于输出:(

护士,护士 - 我的药在哪里?

编辑:我发现这还没有真正回答这个问题.真正的答案可能是"没有人参与其中的想法"或"有人参与认为这是一个坏主意".我强烈建议提供名称或字符集的内部实用程序类避免在代码库周围重复...或者您可以使用我们在Google首次编写此答案时使用的那个.(请注意,从Java 7开始,您只需使用它StandardCharsets.)

  • +1.但作为一种方法而不是字段,以便允许延迟加载(好吧,你可能会想要UTF-8,但是还有一些其他字符集,你可能想要它们的类似设施).不幸的是,这似乎并不是那些做出决定的人非常受欢迎. (2认同)

Rog*_*ger 27

在Java 1.7中

import java.nio.charset.StandardCharsets

例如: StandardCharsets.UTF_8 StandardCharsets.US_ASCII


McD*_*ell 5

编码API的当前状态还有待改进.Java 6的API的某些部分不接受Charset(在地方字符串logging,dom.ls,PrintStream,有可能是其他人).编码应该对标准库的不同部分具有不同的规范名称没有帮助.

我能理解事情是如何到达的; 不确定我对如何修复它们有任何好主意.


作为旁白...

您可以在此处查找Sun Java 6实现的名称.

对于UTF-8,规范值是"UTF-8"for java.nio"UTF8"for java.langjava.io.规范要求JRE支持的唯一编码是:US-ASCII; ISO-8859-1; UTF-8; UTF-16BE; UTF-16LE; UTF-16.

  • 我并不吝惜PrintStream,因为该类确实说"PrintWriter类应该用于需要编写字符而不是字节的情况." (就像所有情况一样......) (2认同)