我不确定SOF是否是提出这个问题的最佳地点,但有关Java URLEncoder 和 URLDecoder 的一些内容。
对于URLEncoder,它具有方法encode(String, String)
,其中第二个参数是要使用的编码名称。如果编码无效,则会抛出UnsupportedEncodingException
。这是一个已检查的异常,因此在调用encode()
时必须使用try-catch语句。就使用字符串编码而言,这是有道理的...
但是Java内置了Charset类,您可以轻松地使用Java的StandardCharsets或Guava的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中搜索了一些东西,但是没有找到。
YourCharset.name()
返回规范名称,您应该能够将其传递给decode()
而不必担心异常。 - jedwards