2013-07-30 55 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()而不用擔心發生異常。

相關問題