【问题标题】:Where to get "UTF-8" string literal in Java?哪里可以在 Java 中获取“UTF-8”字符串文字?
【发布时间】:2011-10-05 14:46:53
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java


【解决方案1】:

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

  • @见JRE character encoding names
  • @since 2.1
  • @deprecated Java 7 引入了 {@link java.nio.charset.StandardCharsets},它将这些常量定义为
  • {@link Charset} 对象。使用 {@link Charset#name()} 获取此类中提供的字符串值。
  • 此类将在以后的版本中删除。

【讨论】:

    【解决方案2】:

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

    import java.nio.charset.StandardCharsets;
    
    ...
    
    StandardCharsets.UTF_8.name();
    

    对于 Android:minSdk 19

    【讨论】:

    • 你使用 .toString() 吗?
    • .toString() 可以工作,但正确的功能是.name()。 99.9% toString 不是答案。
    • btw .displayName() 也可以工作,除非它按预期被本地化覆盖。
    • 你根本不需要打电话给name()。您可以直接将Charset 对象传递给InputStreamReader 构造函数。
    • 还有其他库确实需要String,可能是因为遗留原因。在这种情况下,我会保留一个 Charset 对象,通常从 StandardCharsets 派生,并在需要时使用 name()
    【解决方案3】:

    在 Java 1.7+ 中

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

    import java.nio.charset.StandardCharsets
    
    ...
    
    new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        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 类有关。如果你想抱怨番石榴,那很好,但这不是抱怨的地方。
        • 请不要包含数兆字节的库来获取一个字符串常量。
        【解决方案6】:

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

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

        【讨论】:

        • 默认字符集通常由操作系统和语言环境设置决定,我认为不能保证它对于多个 java 调用保持相同。所以这不能替代一个不断的 sepcifying "utf-8"。
        【解决方案7】:

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

        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()
        【解决方案8】:

        现在我使用来自commons-langorg.apache.commons.lang3.CharEncoding.UTF_8 常量。

        【讨论】:

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

        如果此页面出现在某人的网络搜索中,从 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 本身之后很长时间将其作为默认值。
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

          虽然有一些 3rd 方库包含这些常量。其中之一是 Guava(谷歌核心库):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 实现中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          • 2011-08-16
          相关资源
          最近更新 更多