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

时间:2013-07-30 17:03:35

标签: java character-encoding urlencode urldecode

我不确定SOF是否是提出此问题的最佳位置,但有关java URLEncoderURLDecoder的内容。

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

但是Java内置了Charset类,您可以使用Java's StandardCharsetsGuava's Charsets轻松访问您喜欢的编码的Charset对象。这样可以防止需要捕获一个异常,如果您为encode()提供了拼写正确的编码名称,则该异常将永远不会被抛出。如果没有使用像URLEncoder.encode(String, Charset)这样的方法的能力,我写的代码变得非常难看,因为我需要存储一个额外的String变量来存储编码名称,我有一个非常冗余的try-catch语句,如下所示: / p>

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中缺少的功能?我试着用番石榴寻找东西,却一无所获。

1 个答案:

答案 0 :(得分:5)

我不能肯定地说,但我的猜测只是时间 - URLDecoder推出了JDK 1.0,而Charset后来推出了JDK 1.4。

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