9

我不确定 SOF 是否是问这个问题的最佳场所,但有关 java URLEncoderURLDecoder的一些问题。

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

但是 Java 内置了Charset类,您可以使用Java 的 StandardCharsetsGuava 的 CharsetsCharset轻松访问您喜欢的编码对象。这将防止需要捕获一个您知道如果您提供正确拼写的编码名称将永远不会抛出的异常。如果无法使用类似的方法,我编写的代码会变得非常难看,因为我需要存储一个额外的 String 变量来存储编码名称,并且我有一个非常多余的 try-catch 语句,如下所示:encode()URLEncoder.encode(String, Charset)

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)nor URLDecoder.decode(String, Charset)?Java 语言的开发人员是否有计划支持这一点?它将把我上面写的多行怪物变成一个更令人愉快的单行,不需要我捕捉我知道除非政府将 UTF-8 定为犯罪,否则我知道永远不会发生的异常。是否有任何现有的实现或库可以改进 URLEncoder 和 URLDecoder 中缺少的这个功能?我尝试在 Guava 中搜索一些东西,但一无所获。

4

1 回答 1

5

我不能肯定地说,但我的猜测只是时机—— URLDecoder 与 JDK 1.0 一起出现,而 Charset 后来与 JDK 1.4 一起出现。

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

于 2013-07-30T21:08:35.617 回答