java php urlencode

java - urlencode() el carácter ''asterisco''(estrella?)



url encode java (3)

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

RFC1738: Los localizadores de recursos uniformes (URL) establecen lo siguiente:

Reservado:

[...]

Por lo general, una URL tiene la misma interpretación cuando un octeto está representado por un carácter y cuando se codifica. Sin embargo, esto no es cierto para los 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, solo los caracteres alfanuméricos, los caracteres especiales "$-_.+!*''()," Y los caracteres reservados utilizados para sus fines reservados pueden usarse sin codificar dentro de una URL.

Por otro lado, los caracteres que no requieren codificación (incluidos los caracteres alfanuméricos) pueden codificarse dentro de la parte específica del esquema de una URL, siempre que no se utilicen para un propósito reservado.

Estoy probando PHP urlencode() contra Java java.net.URLEncoder.encode() .

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 caracteres parecen estar codificados de la misma manera con ambas funciones, excepto el carácter de "asterisco" que no está codificado por Java y traducido a% 2A por PHP. ¿Qué comportamiento se supone que es el correcto, si lo hay?

Nota: También probé con rawurlencode() , sin suerte.


Javadoc de URLEncoder refiere a la especificación HTML:

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

HTML4 es muy claro con respecto a esta pregunta y se refiere a RFC1738 , que es citado por aioobe:

Los nombres y valores de control se escapan. Los caracteres espaciales se reemplazan por ''+'', y luego los caracteres reservados se escapan 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 declara directamente que * no debe codificarse:

  • Si el carácter 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
    Reemplace el carácter con una cadena formada de la siguiente manera:
    ...
  • De otra manera
    Deja el personaje como está.

Wikipedia sugiere que * es un carácter reservado cuando se trata de URI, y que debe codificarse si no se utiliza para el propósito reservado. Según RFC3986 , páginas 12-13:

Los URI incluyen componentes y subcomponentes que están delimitados por caracteres en el conjunto "reservado". Estos caracteres se denominan "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 desreferenciación de un URI. Si los datos para un componente de URI entrarían en conflicto con el propósito de un personaje reservado como delimitador, entonces los datos en conflicto deben estar codificados en porcentaje antes de que se forme el URI.

reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "''" / "(" / ")" / "*" / "+" / "," / ";" / "="

(El hecho de que la URL RFC aún permita que el carácter * no esté codificado es que no tiene un propósito reservado para las URL, y como tal no tiene que estar codificado. Por lo tanto, si tiene que codificarlo o no, depende de qué tipo de URI estás creando.