java - new - url encode
Codificación de parámetros de consulta de URL en Java (5)
Desafortunadamente, URLEncoder.encode () no produce un porcentaje de codificación válido (como se especifica en http://tools.ietf.org/html/rfc3986#section-2.1 ).
URLEncoder.encode () codifica todo muy bien, excepto que el espacio está codificado a "+". Todos los codificadores de URI de Java que pude encontrar solo exponen los métodos públicos para codificar la consulta, el fragmento, las partes de la ruta, etc., pero no exponen la codificación "en bruto". Esto es desafortunado ya que los fragmentos y consultas tienen permitido codificar el espacio en +, por lo que no queremos usarlos. La ruta está codificada correctamente, pero está "normalizada" primero, por lo que tampoco podemos usarla para la codificación ''genérica''.
La mejor solución que pude encontrar:
return URLEncoder.encode(raw, "UTF-8").replaceAll("//+", "%20");
Si replaceAll()
es demasiado lento para ti, supongo que la alternativa es rodar tu propio codificador ...
EDITAR: Primero tuve este código que no codifica "?", "&", "=" Correctamente:
//don''t use - doesn''t properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);
¿Cómo se codifican los parámetros de consulta para ir en una url en Java? Lo sé, esto parece una pregunta obvia y ya hecha.
Hay dos sutilezas de las que no estoy seguro:
- ¿Los espacios deben estar codificados en la url como "+" o como "% 20"? En Chrome, si escribo "http://google.com/foo=?bar me", Chrome lo cambia para que se codifique con% 20
- ¿Es necesario / correcto codificar dos puntos ":" como% 3B? Chrome no.
Notas:
-
java.net.URLEncoder.encode
no parece funcionar, parece ser que los datos de codificación se envían desde el formulario. Por ejemplo, codifica el espacio como+
lugar de%20
, y codifica dos puntos, que no es necesario. -
java.net.URI
no codifica los parámetros de consulta
EDITAR: URIUtil
ya no está disponible en versiones más recientes, mejor respuesta en Java - codifique URL o por el Sr. Sindi en este hilo.
URIUtil
de URIUtil
Apache es realmente útil, aunque hay algunas alternatives
URIUtil.encodeQuery(url);
Por ejemplo, codifica el espacio como "+" en lugar de "% 20"
Ambos son perfectamente válidos en el contexto correcto . Aunque si realmente lo prefiere, podría emitir un reemplazo de cadena.
El built in Java URLEncoder está haciendo lo que se supone que debe hacer, y deberías usarlo.
Un "+" o "% 20" son reemplazos válidos para un carácter de espacio en una URL. Cualquiera de los dos funcionará.
Un ":" debe estar codificado, ya que es un carácter separador. es decir, http: // foo o ftp://bar . El hecho de que un navegador en particular pueda manejarlo cuando no está codificado no lo hace correcto. Deberías codificarlos.
Como una buena práctica, asegúrese de usar el método que toma un parámetro de codificación de caracteres. UTF-8 generalmente se usa allí, pero debe proporcionarlo explícitamente.
URLEncoder.encode(yourUrl, "UTF-8");
No es necesario codificar dos puntos como% 3B en la consulta, aunque hacerlo no es ilegal.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "''" / "(" / ")" / "*" / "+" / "," / ";" / "="
También parece que solo los espacios codificados por ciento son válidos, ya que dudo que el espacio sea un ALPHA o un DIGIT
mira a la especificación URI para más detalles.
java.net.URLEncoder.encode(String s, String encoding)
puede ser de ayuda. Sigue la application/x-www-form-urlencoded
codificación de formulario HTML application/x-www-form-urlencoded
.
URLEncoder.encode(query, "UTF-8");
Por otro lado, Percent-encoding (también conocida como Percent-encoding ) codifica el espacio con %20
. Colón es un carácter reservado, por lo que :
seguirá siendo un punto, después de la codificación.