我不確定SOF是否是問這個問題的最佳位置,但是關於java URLEncoder和URLDecoder。爲什麼沒有URLEncoder.encode(String,Charset),URLDecoder.decode(String,Charset)
對於URLEncoder,它有方法encode(String, String)
,其中第二個參數是要使用的編碼的名稱。如果編碼無效,則引發UnsupportedEncodingException
。這是一個檢查異常,所以在調用encode()
時必須使用try-catch語句。這是有道理的,使用一個字符串編碼方面...
但Java有一個建於Charset類,你可以很容易地使用Java's StandardCharsets或Guava'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的這一缺失功能?我試圖尋找番石榴的東西,但什麼都沒發現。
我的猜測只是時機 - 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
@jedwards你應該做出答案。 – ecbrodie
您不'需要存儲額外的字符串變量'。那是你的選擇。無論如何編譯器會彙集所有的「UTF-8」。有關未來Java開發的問題應該針對未來的Java開發人員,而不是SO。 – EJP