到哪里去;UTF-8“;Java中的字符串文字?

到哪里去;UTF-8“;Java中的字符串文字?,java,Java,我试图在这段代码中使用常量而不是字符串文字: new InputStreamReader(new FileInputStream(file), "UTF-8") “UTF-8”经常出现在代码中,最好参考一些静态final变量。你知道在JDK中哪里可以找到这样的变量吗 顺便说一句,再仔细想想,这样的常量是糟糕的设计:您可以使用Charset.defaultCharset()API或file.encoding属性 但是如果您想要自己的常量,您需要自己定义它。没有(至少在标准Java库中是这样)。字

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

new InputStreamReader(new FileInputStream(file), "UTF-8")
“UTF-8”
经常出现在代码中,最好参考一些
静态final
变量。你知道在JDK中哪里可以找到这样的变量吗


顺便说一句,再仔细想想,这样的常量是糟糕的设计:

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

但是如果您想要自己的常量,您需要自己定义它。

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

不过,有些第三方库包含这些常量。其中一个是Guava(谷歌核心库):

这个库(如果你用Java工作,我强烈推荐)有一个带有静态字段的类,比如
Charsets.UTF_8
Charsets.UTF_16
,等等

由于Java7,您应该只使用
Java.nio.charset.StandardCharsets
来代替可比较的常量


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

现在我使用
org.apache.commons.lang3.CharEncoding.UTF_8
常量from。

此常量可用(包括:
UTF-16
US-ASCII
等)在类
org.apache.commons.codec.CharEncoding
中也可以使用。

如果在Someone web搜索中出现此页面,从Java 1.7开始,您现在可以使用它访问标准字符集的常量定义。

在Java 1.7+中,定义
字符集的常量,包括
UTF_8

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();
对于Android:minSdk 19

如果用于Java/Android,则可以使用以下常量:

import com.squareup.okhttp.internal.Util;
Util.UTF_8;//字符集
Util.UTF_8.name();//一串

标准的常量定义。这些 字符集保证在Java的每个实现上都可用 站台。从1.7开始

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;
在Java1.7中+

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

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);

org.apache.commons.lang3.CharEncoding.UTF_8
在引入Java7
Java.nio.charset.StandardCharsets

  • @看
  • @自2.1以来
  • @不推荐使用的Java7引入了{@link Java.nio.charset.StandardCharsets},它将这些常量定义为
  • {@link Charset}对象。使用{@link Charset#name()}获取此类中提供的字符串值
  • 此类将在将来的版本中删除


请参阅。注意:如果您已经在使用Java 7,请使用NIO提供的建议。这是您的链接中给出的一些非常糟糕的建议。他想让你为每一个可能使用的字符串常量创建一个包装器类?我花了一秒钟才理解这个。。。Guava的字符集常量是(毫不奇怪)字符集,而不是字符串。InputStreamReader有另一个构造函数,它采用字符集而不是字符串。如果您真的需要字符串,例如Charsets.UTF_8.name()。字符集确实可能因平台而异,但UTF-8保证存在。在
StandardCharsets
中定义的所有字符集保证存在于每个平台上的每个Java实现中。默认字符集通常由操作系统和语言环境设置确定,我不认为有任何保证它在多个java调用中保持不变。因此,这并不能替代指定“utf-8”的常量。因此,应该是charset.utf_8.name()?@kilaka Yeah使用name()而不是getDisplayName(),因为name()是最终的,getDisplayName()是最终的not@Buffalo:请再次阅读我的回答:建议尽可能使用
java.nio.charset.StandardCharset
,这不是第三方代码。此外,番石榴字符集的定义并没有“不断修改”,AFAIK也从来没有破坏过向后兼容性,所以我认为你的批评是没有道理的。@Buffalo:可能是这样,但我怀疑你的问题与
字符集
类有关。如果你想抱怨番石榴,那没关系,但这里不是抱怨的地方。请不要包括一个多兆字节的库来获取一个字符串常量。我一直在尝试使用它,但它似乎不起作用。”Charset.defaultCharset());'在包含“java.nio.charset.*”之后似乎可以正常工作,但当我尝试使用“File.readAllLines”时,似乎无法显式引用UTF8。@Roger出现了什么问题?在我看来,您可以调用:
Files.readAllLines(path.get(“某个文件的路径”)、StandardCharsets.utf8)我不知道是什么问题,但在更改了一些我不记得的内容后,它对我起了作用。^^^^您可能必须更改IDE中的目标平台。如果在安装IDE时1.6是您的最新JDK,它可能会选择它作为默认值,并在您更新IDE和JDK后很长一段时间将其保留为默认值。对于使用Lang 3.0的用户:
org.apache.commons.lang3.CharEncoding.UTF_8
。(注意“lang3”)。如果您使用的是Java1.7,请参阅下面的@Roger的答案,因为它是标准库的一部分。“下面是@Roger的答案”现在是上面是@Roger的答案。☝由于Java 7引入了Java.nio.charset.standardcharsets,该类已被弃用。您在该类上使用.toString()吗?
。toString()
可以工作,但正确的函数是
.name()
。99.9%的toString不是答案。顺便说一句,如果不按预期为本地化覆盖它,displayName()
也可以工作。您根本不需要调用
name()
。您可以直接将
Charset
对象传递到
InputStreamReader
cons