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

ecb*_*die 8 java urlencode character-encoding urldecode

我不确定SOF是否是最好的问题,但是关于java URLEncoderURLDecoder.

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

但是Java内置了Charset类,您可以Charset使用Java的StandardCharsetsGuava的Charsets轻松访问您喜欢的编码对象.这样可以防止需要捕获一个异常,如果您输入encode()正确拼写的编码名称,则该异常将永远不会被抛出.如果没有使用类似方法的能力URLEncoder.encode(String, Charset),我写的代码变得非常难看,因为我需要存储一个额外的String变量来存储编码名称,我有一个非常冗余的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...");
}
Run Code Online (Sandbox Code Playgroud)

适用的逻辑相同URLDecoder.decode(String, String).

所以因此,我只是想知道,为什么Java的没有URLEncoder.encode(String, Charset),也没有URLDecoder.decode(String, Charset)?Java语言的开发人员有没有计划支持这个?它会把我上面写的多线怪物变成一个更令人愉快的单行,不需要我捕捉一个我知道永远不会发生的例外,除非政府将UTF-8定为犯罪.是否有任何现有的实现或库可以改进URLEncoder和URLDecoder中缺少的功能?我试着在番石榴里寻找东西,却一无所获.

jed*_*rds 5

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

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