在Java中哪里可以获得"UTF-8"字符串文字?

yeg*_*256 450 java

我试图在这段代码中使用常量而不是字符串文字:

new InputStreamReader(new FileInputStream(file), "UTF-8")
Run Code Online (Sandbox Code Playgroud)

"UTF-8"经常出现在代码中,而且更好地引用一些static final变量.你知道我在JDK哪里可以找到这样一个变量吗?

顺便说一句,第二个想法,这样的常量是糟糕的设计:公共静态文字...不是数据复制的解决方案

Rog*_*ger 782

在Java 1.7+中,java.nio.charset.StandardCharsets定义了Charset包含的常量UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();
Run Code Online (Sandbox Code Playgroud)

对于Android:minSdk 19

  • `.toString()`会起作用,但正确的函数是`.name()`.99.9%toString不是答案. (50认同)
  • 你根本不需要调用`name()`.您可以直接将`Charset`对象传递给`InputStreamReader`构造函数. (34认同)
  • 还有其他的libs需要一个`String`,可能是因为遗留原因.在这种情况下,我保留一个`Charset`对象,通常派生自`StandardCharsets`,并在需要时使用`name()`. (6认同)
  • 你对它使用.toString()吗? (3认同)

yeg*_*256 130

现在我org.apache.commons.lang3.CharEncoding.UTF_8commons-lang使用常量.

  • 如果您使用的是Java 1.7,请参阅下面的@ Roger的答案,因为它是标准库的一部分. (24认同)
  • 对于使用Lang 3.0的人:`org.apache.commons.lang3.CharEncoding.UTF_8`.(注意"lang3"). (4认同)
  • PS“@Roger's answer below”现在是@Roger's answer _above_。☝ (4认同)

Dan*_*den 61

谷歌番石榴库(我会强烈建议,无论如何,如果你用Java做的工作)有一个Charsets与像静态字段级的Charsets.UTF_8,Charsets.UTF_16

从Java 7开始,你应该只使用java.nio.charset.StandardCharsets类似的常量.

请注意,这些常量不是字符串,它们是实际的Charset实例.采用charset名称的所有标准API也都有一个重载,它会占用Charset您应该使用的对象.

  • 那么,应该是Charsets.UTF_8.name()? (3认同)
  • @Buffalo:请再次阅读我的回答:它建议尽可能使用`java.nio.charset.StandardCharsets`,这不是第三方代码.此外,Guava Charsets定义并未"不断修改",AFAIK从未破坏向后兼容性,因此我认为您的批评是不合理的. (3认同)
  • @Buffalo:可能是这样,但是我怀疑您的问题与`Charsets`类有关。如果您想抱怨番石榴,那很好,但这不是这些抱怨的地方。 (2认同)
  • 请不要包含一个多兆字节的库来获取一个字符串常量。 (2认同)

cos*_*jav 47

如果此页面出现在某些Web搜索中,从Java 1.7开始,您现在可以使用java.nio.charset.StandardCharsets来访问标准字符集的常量定义.


tsk*_*zzy 8

没有(至少在标准Java库中).字符集因平台而异,因此Java中没有标准列表.

但是有一些第三方库包含这些常量.其中一个是Guava(谷歌核心库):http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html

  • "StandardCharsets"中定义的所有字符集都保证存在于每个平台上的每个Java实现中. (3认同)

Mos*_*our 8

在 Java 1.7+ 中

不要使用“UTF-8”字符串,而是使用Charset类型参数:

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)


pau*_*sm4 7

您可以使用Charset.defaultCharset()API或file.encoding属性.

但如果你想要自己的常数,你需要自己定义它.

  • 默认字符集通常由操作系统和语言环境设置决定,我认为没有任何保证它对多个java调用保持不变.因此,这不能替代常量的"utf-8". (11认同)

Alf*_*llo 7

该常量(其中包括如:UTF-16,US-ASCII,等)的类org.apache.commons.codec.CharEncoding也是如此.


JJD*_*JJD 5

如果您在Java/Android上使用OkHttp,您可以使用以下常量:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String
Run Code Online (Sandbox Code Playgroud)

  • 它已从 OkHttp 中删除,因此下一个方法是:`Charset.forName("UTF-8").name()` 当您需要支持低于 API 19+ 的 Android 时,否则您可以使用:`StandardCharsets.UTF_8.name() ` (2认同)