字符集问题本身是令人困惑和复杂的,但最重要的是,你必须记住你的字符集的确切名称。是“utf8”吗?或“utf - 8”?或者是“UTF-8”?当你在网上搜索代码样本时,你会看到上面所有的代码。为什么不直接将它们命名为常量并使用Charset.UTF8呢?


当前回答

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

如果你被Java 5/6卡住了,你可以使用Guava的Charsets常量,就像Kevin Bourrillion和Jon Skeet建议的那样。

其他回答

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

如果你被Java 5/6卡住了,你可以使用Guava的Charsets常量,就像Kevin Bourrillion和Jon Skeet建议的那样。

我很久以前就用UTF_8、ISO_8859_1和US_ASCII字符集常量定义了一个实用程序类。

此外,很久以前(2年多),我在new String(byte[], Charset)和new String(byte[], String charset_name)之间做了一个简单的性能测试,发现后一种实现要快得多。如果您仔细查看源代码,您会发现它们确实遵循了完全不同的路径。

出于这个原因,我在同一个类中包含了一个实用程序

public static String stringFromByteArray (
    final byte[] array,
    final Charset charset
)
{
    try
    {
        return new String( array, charset.name( ) )
    }
    catch ( UnsupportedEncodingException ex )
    {
        // cannot happen
    }
}

为什么String(byte[], Charset)构造函数不做同样的事情,打败了我。

编码API的当前状态还有待改进。Java 6 API的某些部分不接受Charset来代替字符串(在日志记录中,dom。ls, PrintStream;可能还有其他的)。对于标准库的不同部分,编码应该具有不同的规范名称,这并没有帮助。

我能理解事情是如何发展到现在这个地步的;我不确定我有什么好主意来解决它们。


题外话……

您可以在这里查找Sun的Java 6实现的名称。

对于UTF-8, java的规范值是“UTF-8”。nio和java的“UTF8”。Lang和java.io。该规范要求JRE支持的编码只有:US-ASCII;iso - 8859 - 1;utf - 8;UTF-16BE;UTF-16LE;utf - 16。

在Java 1.7中

进口java.nio.charset.StandardCharsets

例: StandardCharsets。UTF_8 StandardCharsets。US_ASCII

对所问问题的简单回答是,可用的字符集字符串因平台而异。

然而,有六个是必须存在的,所以很久以前就可以为它们做常数了。我不知道为什么他们没有。

JDK 1.4 did a great thing by introducing the Charset type. At this point, they wouldn't have wanted to provide String constants anymore, since the goal is to get everyone using Charset instances. So why not provide the six standard Charset constants, then? I asked Martin Buchholz since he happens to be sitting right next to me, and he said there wasn't a really particularly great reason, except that at the time, things were still half-baked -- too few JDK APIs had been retrofitted to accept Charset, and of the ones that were, the Charset overloads usually performed slightly worse.

令人遗憾的是,直到JDK 1.6中,他们才最终完成了Charset重载的所有配置。而且这种性能落后的情况仍然存在(原因非常奇怪,我无法解释,但与安全性有关!)

长话短说——只要定义你自己的常量,或者使用Tony the Pony链接到的Guava的Charsets类(尽管这个库还没有真正发布)。

更新:在JDK 7中有一个StandardCharsets类。