2008-11-20 16 views
10

¿Cuál es la mejor manera de codificar cadenas de URL de forma que sean compatibles con RFC2396 y para decodificar una cadena compatible con RFC2396 tal que, por ejemplo, 20% se sustituye por un carácter de espacio?codificar y decodificar URLs RFC2396

edit: URLEncoder y URLDecoder clases hacen no de codificación/decodificación de direcciones URL compatibles RFC2396, que codifican a un tipo MIME de aplicación urlencoded-x-www-form/que se utiliza para codificar datos de parámetros de formulario HTML.

+0

no es application/www-form-x-urlencoded la misma cosa? –

+0

No, no lo es. La codificación RFC2396 no es lo mismo que la codificación para datos de formularios HTML. – Gili

+2

Ver http://stackoverflow.com/questions/444112/how-do-i-encode-uri-parameter-values ​​Hay pocas respuestas. –

Respuesta

11

utilizar la clase URI de la siguiente manera:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null); 
URL url = uri.toURL(); 

o si desea una cadena:

String urlString = uri.toASCIIString();
1

Los javadocs recomiendan el uso de la clase java.net.URI para llevar a cabo la codificación. Para asegurarse de que la clase de URI codifica correctamente la url, se debe usar uno de los constructores de argumentos múltiples. Estos constructores realizarán la codificación requerida, pero requieren analizar cualquier cadena de URL en los parámetros.

Si desea decodificar, debe construir el URI con el constructor único argumento, que no hace ninguna codificación. A continuación, puede llamar a métodos como getPath() etc. para recuperar y construir la URL descodificada.

+0

Los constructores de argumentos múltiples no ayudan porque no hay forma de decirles qué parte de la cadena de consulta necesita ser codificada y cuál no. Necesitamos un método que incluya un valor de parámetro y devuelva el formulario codificado en URL. – Gili

+0

Es posible que toda la cadena de consulta deba codificarse según lo que pueda contener. –

2

Sus partes componentes, que contienen caracteres potencialmente que debe ser escapado, ya deberían haberse escapado utilizando URLEncoder antes de ser concatenados en un URI.

Si tiene un URI con caracteres fuera de banda (como espacio, "<> [] {} \ | ^` y bytes no ASCII), no es realmente un URI. Puede intentar arréglelos manualmente, escórrelos, pero esta es una operación de reparación de última hora y no una forma estándar de codificación. Esto suele ser necesario cuando acepta URI potencialmente malformados a partir de la entrada del usuario, pero no es una norma estandarizada. operación y no sé de ninguna función incorporada de la biblioteca Java que lo haga por usted, puede que tenga que hackear algo usted mismo con un RegExp.

En la otra dirección, debe tomar su URI aparte en sus partes componentes (cada parte de ruta separada, nombre y valor de parámetro de consulta, etc.) antes de que pueda deshacer el diseño de cada parte (utilizando un URLDecoder). No hay una forma sensata de codificar% un URI completo de una vez; podría intentar 'decodificar% -escapes que no decodifiquen a delimitadores' (como /? = &;%), pero le quedaría una cadena extraña e incoherente que no se ajusta a ningún estándar de procesamiento de URI.

URLEncoder/URLDecoder están muy bien para el manejo de componentes de consulta URI, ambos nombres y valores. Sin embargo, no son bastante adecuado para el manejo de componentes de la pieza de ruta URI. La diferencia es que el carácter '+' no significa un espacio en una parte de ruta. Puede solucionar esto con una simple sustitución de cadena: después de URLEncoding, reemplace '+' con '% 20'; antes de URLDecoding, reemplace '+' con '% 2B'. Puede ignorar la diferencia si no planea incluir segmentos que contengan espacios o más en su ruta.

+1

Suena arriesgado. Sería mucho más seguro usar un codificador diseñado para RFC2396 que intentar hackear URLEncoder en uno. Puede cometer un error. – Gili

Cuestiones relacionadas