【问题标题】:Is Java UTF-8 Charset exception possible?Java UTF-8 Charset 异常可能吗?
【发布时间】:2011-06-30 06:56:20
【问题描述】:

在使用"UTF-8" 编码时,Java 是否可以抛出 UnsupportedEncodingException,或者我可以安全地抑制它的抛出?

【问题讨论】:

    标签: java exception utf-8 character-encoding


    【解决方案1】:

    正如 McDowell 在对 templatetypdef's answer 的评论中指出的那样:如果在实例化新的 String 时使用 Charset 对象而不是传递字符集的名称,则不必处理 @987654324 @ 或任何其他已检查的异常:

    byte[] bytes = ...;
    
    // Requires you to handle UnsupportedEncodingException
    String s1 = new String(bytes, "UTF-8");
    
    // Doesn't require you to handle any checked exceptions
    String s2 = new String(bytes, Charset.forName("UTF-8"));
    

    这是我们必须忍受的 Java 标准库的不一致...

    请注意,Charset.forName(...) 可以抛出异常(IllegalCharsetNameException、IllegalArgumentException、UnsupportedCharsetException),但这些都是未经检查的异常,因此您不必自己捕获或重新抛出它们。

    edit - 从 Java 7 开始,有一个类 java.nio.charset.StandardCharsets 具有用于常用字符编码的常量。示例:

    String s3 = new String(bytes, StandardCharsets.UTF_8);
    

    【讨论】:

      【解决方案2】:

      根据the Javadoc for Charset,每个Java 实现都必须支持UTF-8 以及其他一些字符集。因此,我认为您可以放心地抑制异常;除非你有一个不兼容的 Java 实现,否则这应该不会失败。

      【讨论】:

      • 另外,如果您可以使用Charset 类而不是直接字符串文字,则您不需要处理UnsupportedEncodingException。
      【解决方案3】:

      最简单的方法是创建一个 UTF-8 字符集常量。那么您就不必一次又一次地捕获 UnsupportedEncodingException:

      public class Charsets {
          public static final Charset UTF_8 = Charset.forName("UTF-8");
      }
      

      编辑(2014-04):

      使用 Java 7,您不必创建自己的常量。您可以直接使用StandardCharsets.UTF_8。

      【讨论】:

      • 非常明智。对于所有 JVM 保证的字符集,Oracle 应该将这样的常量添加到 Charset 类中。编辑:没关系,我看到他们终于在 java 7 中做到了。
      【解决方案4】:

      它应该存在于每个 Java 运行时中,因此如果它丢失,重新抛出运行时异常是合理的。不过,我不会称其为“压制”。对我来说,抑制意味着捕捉异常并假装它没有发生。如果缺少编码,不确定您将如何进行。

      【讨论】:

        【解决方案5】:

        这取决于您所说的“安全”和“抑制”。

        我很想捕获异常并在其位置抛出未经检查的异常(或AssertionError)。您的应用程序可能永远不会遇到这种情况。但是谁知道……有人可能会在一些不符合 UTF-8 的不符合标准的平台上运行它。而且这样做几乎没有任何成本……尤其是因为您必须“做某事”,但最初的例外情况。

        【讨论】:

          【解决方案6】:

          我已经使用了下面的代码行,它对我有用

          旧代码

          byte[] hash = digest.digest(input.getBytes("UFT-8"));

          更新代码

          byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));

          【讨论】:

            猜你喜欢
            • 2016-02-14
            • 2020-10-26
            • 1970-01-01
            • 2020-08-04
            • 1970-01-01
            • 2010-10-12
            • 2012-02-22
            • 2017-02-08
            • 1970-01-01
            相关资源
            最近更新 更多