为什么没有URLEncoder.encode(String, Charset)和URLDecoder.decode(String, Charset)?

9

我不确定SOF是否是提出这个问题的最佳地点,但有关Java URLEncoderURLDecoder 的一些内容。

对于URLEncoder,它具有方法encode(String, String),其中第二个参数是要使用的编码名称。如果编码无效,则会抛出UnsupportedEncodingException。这是一个已检查的异常,因此在调用encode()时必须使用try-catch语句。就使用字符串编码而言,这是有道理的...

但是Java内置了Charset类,您可以轻松地使用Java的StandardCharsetsGuava的Charsets访问您最喜欢的编码的Charset对象,这将避免需要捕获一个明知道不会抛出的异常。如果您向encode()提供了正确拼写的编码名称。没有像URLEncoder.encode(String, Charset)这样的方法,我编写的代码变得非常丑陋,因为我需要存储一个额外的字符串变量来存储编码名称,并且我有一个非常冗余的try-catch语句,如下所示:

private static final String utf8 = "UTF-8";
...
String msg = ...;
try {
    String encodedMsg = URLEncoder.encode(msg, utf8);
    ...
} catch (UnsupportedEncodingException e) {
    // This exception should never happen
    System.err.println("Uh oh...");
}

同样的逻辑也适用于URLDecoder.decode(String, String)
因此,我想知道为什么Java没有URLEncoder.encode(String, Charset)URLDecoder.decode(String, Charset)? Java语言的开发人员有计划支持这个吗?它会将我上面写的多行代码变成一个更加愉快的单行代码,而不需要我捕获一个我知道除非政府将UTF-8定为犯罪,否则永远不会发生的异常。是否有任何现有的实现或库可以改进URLEncoder和URLDecoder缺失的这个功能?我尝试在Guava中搜索了一些东西,但是没有找到。

3
我的猜测只是时间问题- URLDecoder 是在 JDK 1.0 中推出的,而 Charset 则是在 JDK 1.4 中推出的。YourCharset.name() 返回规范名称,您应该能够将其传递给 decode() 而不必担心异常。 - jedwards
@jedwards,你应该把那个变成一个答案。 - ecbrodie
你不需要存储额外的字符串变量,那是你的选择。编译器会将所有的“UTF-8”汇集在一起。关于未来Java开发的问题应该向未来的Java开发人员提问,而不是SO。 - user207421
1个回答

5

我不能确定,但我的猜测只是时间问题 - URLDecoder随JDK 1.0一起发布,而Charset后来随JDK 1.4一起发布。

YourCharset.name()返回一个包含规范名称的字符串,您应该能够将其传递给decode()而不必担心异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接