【发布时间】:2011-06-30 06:56:20
【问题描述】:
在使用"UTF-8" 编码时,Java 是否可以抛出 UnsupportedEncodingException,或者我可以安全地抑制它的抛出?
【问题讨论】:
标签: java exception utf-8 character-encoding
在使用"UTF-8" 编码时,Java 是否可以抛出 UnsupportedEncodingException,或者我可以安全地抑制它的抛出?
【问题讨论】:
标签: java exception utf-8 character-encoding
正如 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);
【讨论】:
根据the Javadoc for Charset,每个Java 实现都必须支持UTF-8 以及其他一些字符集。因此,我认为您可以放心地抑制异常;除非你有一个不兼容的 Java 实现,否则这应该不会失败。
【讨论】:
Charset 类而不是直接字符串文字,则您不需要处理UnsupportedEncodingException。
最简单的方法是创建一个 UTF-8 字符集常量。那么您就不必一次又一次地捕获 UnsupportedEncodingException:
public class Charsets {
public static final Charset UTF_8 = Charset.forName("UTF-8");
}
编辑(2014-04):
使用 Java 7,您不必创建自己的常量。您可以直接使用StandardCharsets.UTF_8。
【讨论】:
它应该存在于每个 Java 运行时中,因此如果它丢失,重新抛出运行时异常是合理的。不过,我不会称其为“压制”。对我来说,抑制意味着捕捉异常并假装它没有发生。如果缺少编码,不确定您将如何进行。
【讨论】:
这取决于您所说的“安全”和“抑制”。
我很想捕获异常并在其位置抛出未经检查的异常(或AssertionError)。您的应用程序可能永远不会遇到这种情况。但是谁知道……有人可能会在一些不符合 UTF-8 的不符合标准的平台上运行它。而且这样做几乎没有任何成本……尤其是因为您必须“做某事”,但最初的例外情况。
【讨论】:
我已经使用了下面的代码行,它对我有用
byte[] hash = digest.digest(input.getBytes("UFT-8"));
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
【讨论】: