¿Cómo codifico los valores del parámetro URI?

Deseo enviar un URI como el valor de un parámetro query / matrix. Antes de que pueda agregarlo a un URI existente, necesito codificarlo de acuerdo con RFC 2396. Por ejemplo, dada la entrada:

http://google.com/resource?key=value1 & value2

Espero la salida:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2

Ni java.net.URLEncoder ni java.net.URI generarán el resultado correcto. URLEncoder está destinado a la encoding de formularios HTML que no es lo mismo que RFC 2396. URI no tiene ningún mecanismo para codificar un solo valor a la vez, por lo que no tiene forma de saber que value1 y value2 son parte de la misma clave.

El UriBuilder de Jersey codifica los componentes de URI utilizando application / x-www-form-urlencoded y RFC 3986 según sea necesario. De acuerdo con el Javadoc

Los métodos de comstackción realizan la encoding contextual de los caracteres no permitidos en el componente URI correspondiente siguiendo las reglas del tipo de aplicación / x-www-form-urlencoded para los parámetros de consulta y RFC 3986 para los demás componentes. Tenga en cuenta que solo los caracteres no permitidos en un componente particular están sujetos a encoding, por ejemplo, una ruta suministrada a uno de los métodos de ruta puede contener parámetros de matriz o múltiples segmentos de ruta ya que los separadores son caracteres legales y no serán codificados. Los valores porcentuales codificados también se reconocen cuando están permitidos y no serán doblemente codificados.

También puedes usar UriUtils de Spring

No tengo suficiente reputación para comentar las respuestas, pero solo quería señalar que la descarga de la api JSR-311 por sí sola no funcionará. Debe descargar la implementación de referencia ( jersey ).

Solo descargar la API de la página JSR le dará una ClassNotFoundException cuando la API trate de buscar una implementación en tiempo de ejecución.

Yo escribí el mío, es corto, súper simple, y puedes copiarlo si lo deseas: http://www.dmurph.com/2011/01/java-uri-encoder/

Parece que CharEscapers de Google GData-java-client tiene lo que quieres. Tiene el método uriPathEscaper, uriQueryStringEscaper y uriEscaper genérico. (Todos devuelven el objeto Escaper que escapa realmente). Licencia de Apache.

Creo que la clase de URI es la que estás buscando.

Mmhh, sé que ya descartó URLEncoder, pero a pesar de lo que dicen los documentos, decidí probarlo.

Tu dijiste:

Por ejemplo, dada una entrada:

http://google.com/resource?key=value

Espero la salida:

http% 3a% 2f% 2fgoogle.com% 2fresource% 3fkey% 3dvalue

Asi que:

 C:\oreyes\samples\java\URL>type URLEncodeSample.java import java.net.*; public class URLEncodeSample { public static void main( String [] args ) throws Throwable { System.out.println( URLEncoder.encode( args[0], "UTF-8" )); } } C:\oreyes\samples\java\URL>javac URLEncodeSample.java C:\oreyes\samples\java\URL>java URLEncodeSample "http://google.com/resource?key=value" http%3A%2F%2Fgoogle.com%2Fresource%3Fkey%3Dvalue 

Como se esperaba.

¿Cuál sería el problema con esto?