2013-07-30 13 views
8

Ich bin mir nicht sicher, ob SOF der beste Platz ist, um dies zu fragen, aber etwas über die Java URLEncoder und URLDecoder.Warum kein URLEncoder.encode (String, Zeichensatz), URLDecoder.decode (String, Zeichensatz)

Für URLEncoder hat es die Methode encode(String, String), wobei der zweite Parameter der Name der zu verwendenden Codierung ist. Wenn die Codierung nicht gültig ist, wird UnsupportedEncodingException ausgelöst. Es ist eine geprüfte Ausnahme, daher muss eine try-catch-Anweisung verwendet werden, wenn encode() aufgerufen wird. Dies macht Sinn, in Bezug auf eine String-Codierung ...

Aber Java hat die Charset Klasse eingebaut und Sie können die Charset Objekt Ihrer Lieblings Codierung Java's StandardCharsets oder Guava's Charsets leicht zugänglich machen. Dies würde verhindern, dass Sie eine Ausnahme abfangen müssen, von der Sie wissen, dass sie nie ausgegeben wird, wenn Sie encode() einen richtig geschriebenen Codierungsnamen eingeben. Ohne die Fähigkeit, eine Methode, wie URLEncoder.encode(String, Charset) zu verwenden, der Code, den ich schreiben wird wirklich hässlich, weil er ein zusätzliches String-Variable speichern, müssen Sie die Codierung Namen zu speichern, und ich habe eine ziemlich überflüssig Try-catch-Anweisung, etwa so:

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..."); 
} 

Die gleiche Logik gilt für URLDecoder.decode(String, String).

Also, ich frage mich nur, warum hat Java nicht URLEncoder.encode(String, Charset) noch URLDecoder.decode(String, Charset)? Haben die Entwickler der Java-Sprache Pläne, dies zu unterstützen? Es würde die mehrzeilige Ungeheuerlichkeit, die ich oben geschrieben habe, in einen angenehmeren Einzeiler verwandeln, der keine Ausnahme erfordert, von der ich weiß, dass sie nie eintreten wird, wenn die Regierung UTF-8 nicht zu einem Verbrechen macht. Gibt es vorhandene Implementierungen oder Bibliotheken, die dieses fehlende Feature von URLEncoder und URLDecoder verbessern? Ich habe versucht, nach etwas in Guava zu suchen, aber nichts gefunden.

+3

Meine Schätzung ist nur Timing - URLDecoder kam mit JDK 1.0 und Charset kam später mit JDK 1.4. ['YourCharset.name()'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#name%28%29) gibt den kanonischen Namen zurück, der Sie sollten in der Lage sein, ohne Angst vor einer Ausnahme zu 'decode()' zu gelangen. – jedwards

+0

@jedwards sollten Sie das eine Antwort geben. – ecbrodie

+0

Sie müssen keine zusätzliche String-Variable speichern. Das war deine Entscheidung. Der Compiler hätte alle "UTF-8" s zusammen gepoolt. Fragen zur zukünftigen Java-Entwicklung sollten an die zukünftigen Java-Entwickler gerichtet werden, nicht an SO. – EJP

Antwort

5

Ich kann nicht sicher sagen, aber meine Vermutung ist nur Timing - URLDecoder kam mit JDK 1.0 und Charset kam später mit JDK 1.4.

YourCharset.name() gibt einen String mit dem kanonischen Namen zurück, den Sie ohne Angst vor einer Ausnahme an decode() übergeben können.