ChatGPT解决这个技术问题 Extra ChatGPT

哪里可以在 Java 中获取“UTF-8”字符串文字?

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

new InputStreamReader(new FileInputStream(file), "UTF-8")

"UTF-8" 经常出现在代码中,并且改为引用一些 static final 变量会更好。你知道我在哪里可以在 JDK 中找到这样的变量吗?

顺便说一句,再想一想,这样的常量是不好的设计:Public Static Literals ... Are Not a Solution for Data Duplication

请参阅this question
注意:如果您已经使用 Java 7,请使用 NIO 中的 Files.newBufferedWriter(Path path, Charset cs)
这是您链接中的一些非常糟糕的建议。他希望您为您可能使用的每个可能的字符串常量创建一个包装类?

J
Jameson

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

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

对于安卓:minSdk 19


您对此使用 .toString() 吗?
.toString() 可以工作,但正确的功能是 .name()。 99.9% toString 不是答案。
顺便说一句,.displayName() 也可以工作,除非它按预期被本地化覆盖。
您根本不需要调用 name()。您可以直接将 Charset 对象传递给 InputStreamReader 构造函数。
还有其他库确实需要 String,可能是由于遗留原因。在这种情况下,我会保留一个 Charset 对象,通常从 StandardCharsets 派生,并在需要时使用 name()
y
yegor256

现在我使用 commons-lang 中的 org.apache.commons.lang3.CharEncoding.UTF_8 常量。


对于使用 Lang 3.0 的用户:org.apache.commons.lang3.CharEncoding.UTF_8。 (注意“lang3”)。
如果您使用的是 Java 1.7,请参阅下面的 @Roger 答案,因为它是标准库的一部分。
PS“@Roger's answer below”现在是@Roger's answer above。 ☝
自 Java 7 引入 java.nio.charset.StandardCharsets 以来,该类已被弃用
J
JuanMoreno

Google Guava 库(如果您使用 Java 工作,我强烈推荐它)有一个 Charsets 类,其中包含 Charsets.UTF_8Charsets.UTF_16 等静态字段。

从 Java 7 开始,您应该只使用 java.nio.charset.StandardCharsets 来代替可比较的常量。

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


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

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


我一直在尝试使用它,但它似乎不起作用。 'Charset.defaultCharset());'在包含“java.nio.charset.*”之后似乎可以工作,但是当我尝试使用“File.readAllLines”时,我似乎无法明确引用 UTF8。
@Roger 似乎是什么问题?据我所知,您可以致电:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
我不知道问题出在哪里,但是在更改了我不记得的东西后,它对我有用。
^^^ 您可能不得不在 IDE 中更改目标平台。如果 1.6 是您安装 IDE 时的最新 JDK,它可能会将其选为默认值,并在您就地更新 IDE 和 JDK 本身之后很长时间将其保留为默认值。
A
Alfredo Carrillo

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


t
tskuzzy

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

不过,有一些 3rd 方库包含这些常量。其中之一是 Guava(Google 核心库):http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


我花了一秒钟才明白这一点...... Guava 的字符集常量(毫不奇怪)是字符集,而不是字符串。 InputStreamReader 有另一个构造函数,它采用 Charset 而不是字符串。如果你真的需要字符串,例如 Charsets.UTF_8.name()。
字符集可能因平台而异,但 UTF-8 保证存在。
StandardCharsets 中定义的所有字符集都保证存在于每个平台上的每个 Java 实现中。
A
Andrew Tobilko

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

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


默认字符集通常由操作系统和语言环境设置决定,我认为不能保证它对于多个 java 调用保持相同。因此,这不能替代恒定的“utf-8”。
M
Mostafa Vatanpour

在 Java 1.7+ 中

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

import java.nio.charset.StandardCharsets

...

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

J
JJD

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

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String

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

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

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;

s
sendon1982

在 Java 7 引入 java.nio.charset.StandardCharsets 后,类 org.apache.commons.lang3.CharEncoding.UTF_8 已弃用

@see JRE 字符编码名称

@从 2.1 开始

@deprecated Java 7 引入了 {@link java.nio.charset.StandardCharsets},它将这些常量定义为

{@link Charset} 对象。使用 {@link Charset#name()} 获取此类中提供的字符串值。

此类将在未来的版本中删除。