2013-07-30 29 views
8

我不确定SOF是否是问这个问题的最佳位置,但是关于java URLEncoderURLDecoder为什么没有URLEncoder.encode(String,Charset),URLDecoder.decode(String,Charset)

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

但Java有一个建于Charset类,你可以很容易地使用Java's StandardCharsetsGuava's 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的这一缺失功能?我试图寻找番石榴的东西,但什么都没发现。

+3

我的猜测只是时机 - URLDecoder与JDK 1.0一起推出,随后的Charset与JDK 1.4一起推出。 ['YourCharset.name()'](http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#name%28%29)返回规范名称,你应该能够传递给'decode()'而不用担心异常。 – jedwards

+0

@jedwards你应该做出答案。 – ecbrodie

+0

您不'需要存储额外的字符串变量'。那是你的选择。无论如何编译器会汇集所有的“UTF-8”。有关未来Java开发的问题应该针对未来的Java开发人员,而不是SO。 – EJP

回答

5

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

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

相关问题