2011-06-30 12 views
16

Estoy probando PHPurlencode() vs Javajava.net.URLEncoder.encode().urlencode() el 'asterisco' (estrella?) Carácter

Java

String all = ""; 
for (int i = 32; i < 256; ++i) { 
    all += (char) i; 
} 

System.out.println("All characters:   -||" + all + "||-"); 
try { 
    System.out.println("Encoded characters:  -||" + URLEncoder.encode(all, "utf8") + "||-"); 
} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} 

PHP

$all = ""; 
for($i = 32; $i < 256; ++$i) 
{ 
    $all = $all.chr($i); 
} 

echo($all.PHP_EOL); 
echo(urlencode(utf8_encode($all)).PHP_EOL); 

Todos los personajes parecen estar codificado de la misma manera con las dos funciones, a excepción del carácter 'asterisco' que no está codificado por Java, y traducido a% 2A por PHP. ¿Qué comportamiento se supone que es el "correcto", si hay alguno?

Nota: probé con rawurlencode(), también, no tuve suerte.

+0

le he pedido a una [pregunta similar] (http://stackoverflow.com/questions/25085992/when-should-an-asterisk-be-encoded-in-an-http-url) a Intenta obtener una respuesta más completa. –

Respuesta

8

Está bien tener un * en una URL, (pero también está bien tenerlo en su forma codificada).

RFC1738: Uniform Resource Locators (URL) indica lo siguiente:

Reservado:

[...]

Por lo general, una URL tiene la misma interpretación cuando un octeto se representado por un personaje y cuando codificado Sin embargo, esto no es true para caracteres reservados: la codificación de un carácter reservado para un esquema particular puede cambiar la semántica de una URL.

Por lo tanto, ser alfanuméricos, los caracteres especiales "$-_.+!*'(),", y caracteres reservados utilizados para sus fines reservadas puede usarse sin codificar dentro de un URL.

Por otra parte, los caracteres que no son necesarios para codificar (incluyendo caracteres alfanuméricos) puede ser codificado dentro del parte específica del esquema de una dirección URL, siempre y cuando no están siendo utilizados para una reservada propósito.

+0

+1 De hecho, del conjunto '$ -_. +! * '(),', Java solo usa '-_. *' En forma no codificada: http://docs.oracle.com/javase/7/ docs/api/java/net/URLEncoder.html – caw

+1

Y la única diferencia entre Java y PHP parece ser el asterisco: PHP usa '% 2A' mientras que Java usa' * '. – caw

6

Wikipedia suggests que * es un carácter reservado cuando se trata de URIs, y que debe ser codificado si no se utiliza con el propósito reservado. De acuerdo con RFC3986, páginas 12-13:

URIs incluyen componentes y subcomponentes que están delimitados por caracteres en el conjunto de "reservado". Estos caracteres se llaman "reservados" porque pueden (o no) definirse como delimitadores por la sintaxis genérica, por cada sintaxis específica del esquema o por la sintaxis específica de la implementación del algoritmo de eliminación de referencias del URI. Si los datos de un componente de URI entrarían en conflicto con el propósito de un carácter reservado de como delimitador, los datos en conflicto deben ser con codificación porcentual antes de formar el URI.

reserved = gen-delims/sub-delims 

    gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

(El hecho de que the URL RFC todavía permite que el personaje * para ir sin codificar es que se no tienen un propósito reservada i URL, y como tal no tiene que ser codificado. Así wether usted tiene que codificar o no depende de qué tipo de URI que está creando)

+0

¿Podría incluir la cita de la página que dice que '*' debe codificarse? – aioobe

+0

@aioobe: Hecho. Parece haber una discrepancia entre la URL y las RFC de URI, donde la URL RFC en efecto anula el requisito RFC de URI para codificar '*'. Entonces la respuesta realmente depende del tipo de URI que estás creando. – You

+2

'urlencode' y' java.net.URLEncoder' indica que está buscando una URL. – aioobe

2

Javadoc of URLEncoder refiere a la especificación HTML:.

Th es clase contiene métodos estáticos para convertir una cadena al formato MIME application/x-www-form-urlencoded. Para obtener más información sobre la codificación de formularios HTML, consulte la especificación HTML.

HTML4 es bastante claro con respecto a esta cuestión y se refiere a RFC1738, que es citado por aioobe:

nombres y valores de control se escaparon. Los caracteres espaciales se reemplazan por '+', y luego se escapan los caracteres reservados como se describe en [RFC1738], sección 2.2: Los caracteres no alfanuméricos se reemplazan por '% HH', un signo de porcentaje y dos dígitos hexadecimales que representan el código ASCII del personaje. Los saltos de línea se representan como pares "CR LF" (es decir, '% 0D% 0A').

Sin embargo, HTML5 Estados directamente * que no deben ser codificados:

  • Si el personaje no está en el rango U + 0020, U + 002A, U + 002D, U + 002e, U + 0030 a U + 0039, U + 0041 a U + 005A, U + 005F, U + 0061 a U + 007A
    reemplazar el carácter de una cadena formada de la siguiente manera:
    ...
  • Othe rwise
    Deja el personaje como está.