La codificación porcentual , también conocida como codificación URL , es un método para codificar datos arbitrarios en un identificador uniforme de recursos (URI) utilizando únicamente los caracteres US-ASCII permitidos dentro de un URI. La codificación porcentual se utiliza para garantizar que los caracteres especiales no interfieran con la estructura e interpretación del URI. Los caracteres especiales se reemplazan con un signo de porcentaje (%) seguido de dos dígitos hexadecimales que representan el valor en bytes del carácter. Por ejemplo, un espacio se codifica comúnmente como %20:
- original:
http://example.com/my file.txt - codificado:
http://example.com/my%20file.txt
Aunque se la conoce como codificación URL , también se utiliza de forma más general dentro del conjunto principal de identificadores uniformes de recursos (URI), que incluye tanto el localizador uniforme de recursos (URL) como el nombre uniforme de recursos (URN). Por consiguiente, también se utiliza en la preparación de datos de application/x-www-form-urlencodedtipo multimedia , como suele ocurrir al enviar datos de formularios HTML en solicitudes HTTP . La codificación porcentual no distingue entre mayúsculas y minúsculas.
Codificación porcentual en una URI
Los caracteres permitidos en una URI pueden ser reservados o no reservados (o un carácter de porcentaje como parte de una codificación porcentual). Los caracteres reservados son aquellos que a veces tienen un significado especial. Por ejemplo, la barra inclinada se utiliza para separar diferentes partes de una URL (o, en general, de una URI). Los caracteres no reservados no tienen tales significados. Al usar la codificación porcentual, los caracteres reservados se representan mediante secuencias de caracteres especiales. Los conjuntos de caracteres reservados y no reservados, así como las circunstancias en las que ciertos caracteres reservados tienen un significado especial, han cambiado ligeramente con cada revisión de las especificaciones que rigen las URI y los esquemas de URI.
Los demás caracteres de una URI deben codificarse en porcentaje.
Personajes reservados
Cuando un carácter del conjunto reservado tiene un significado especial (un propósito reservado) en un contexto determinado, y un esquema URI indica que es necesario usar ese carácter para algún otro propósito, entonces el carácter debe codificarse en porcentaje . La codificación en porcentaje de un carácter reservado implica convertir el carácter a su valor de byte correspondiente en ASCII y luego representar ese valor como un par de dígitos hexadecimales (si hay un solo dígito hexadecimal, se agrega un cero inicial ). Los dígitos, precedidos por un signo de porcentaje ( %) como carácter de escape , se usan en el URI en lugar del carácter reservado. (Un carácter que no es ASCII generalmente se convierte a su secuencia de bytes en UTF-8 , y luego cada valor de byte se representa como se indicó anteriormente).
El carácter reservado /, por ejemplo, si se usa en el componente "ruta" de una URI , tiene el significado especial de ser un delimitador entre segmentos de ruta. Si, según un esquema URI dado, /necesita estar en un segmento de ruta, entonces se deben usar los tres caracteres %2Fo en el segmento en lugar de un sin formato .%2f/
Los caracteres reservados que no tienen una finalidad específica en un contexto particular también pueden codificarse con porcentaje, pero no son semánticamente diferentes de aquellos que no lo están.
En el componente de consulta de una URI (la parte posterior a un ?carácter), por ejemplo, /el carácter sigue considerándose reservado, pero normalmente no tiene una función reservada, a menos que un esquema de URI específico indique lo contrario. El carácter no necesita codificarse con porcentaje cuando no tiene una función reservada.
Las URI que difieren únicamente en si un carácter reservado está codificado en porcentaje o aparece literalmente, normalmente no se consideran equivalentes (no representan el mismo recurso), a menos que se pueda determinar que los caracteres reservados en cuestión no tienen una función reservada. Esta determinación depende de las reglas establecidas para los caracteres reservados por cada esquema de URI.
Personajes sin reservas
Los caracteres del conjunto no reservado nunca necesitan ser codificados en porcentaje.
Las URI que difieren únicamente en si un carácter no reservado está codificado con porcentaje o aparece literalmente son equivalentes por definición, pero los procesadores de URI, en la práctica, no siempre reconocen esta equivalencia. Por ejemplo, los consumidores de URI no deberían tratar %41de forma diferente a Ao %7Ede ~, pero algunos lo hacen. Para lograr la máxima interoperabilidad, se desaconseja a los productores de URI que codifiquen con porcentaje los caracteres no reservados.
Porcentaje de caracteres
Debido a que el carácter de porcentaje ( %) sirve para indicar octetos codificados en porcentaje, debe estar codificado en porcentaje para %25poder usarse como datos dentro de una URI.
Datos arbitrarios
La mayoría de los esquemas URI implican la representación de datos arbitrarios, como una dirección IP o una ruta de sistema de archivos , como componentes de una URI. Las especificaciones de los esquemas URI deberían, pero a menudo no lo hacen, proporcionar una correspondencia explícita entre los caracteres de la URI y todos los posibles valores de datos representados por dichos caracteres.
Datos binarios
Desde la publicación de RFC 1738 en 1994, se ha especificado que los esquemas que proporcionan la representación de datos binarios en una URI deben dividir los datos en bytes de 8 bits y codificar cada byte en porcentaje de la misma manera que arriba. [ 1 ] [ 2 ] [ 3 ] El valor de byte 0x0F, por ejemplo, debe representarse como %0F, pero el valor de byte 0x41 puede representarse como A, o %41. El uso de caracteres sin codificar para caracteres alfanuméricos y otros caracteres no reservados es generalmente preferido, ya que da como resultado URL más cortas.
Datos de personajes
El procedimiento para codificar datos binarios en porcentaje se ha extrapolado con frecuencia, a veces de forma inapropiada o sin especificar completamente, para aplicarlo a datos basados en caracteres. En los primeros años de la World Wide Web , al trabajar con caracteres de datos del repertorio ASCII y usar sus bytes correspondientes en ASCII como base para determinar secuencias codificadas en porcentaje, esta práctica era relativamente inofensiva; simplemente se asumía que los caracteres y los bytes se correspondían uno a uno y eran intercambiables. Sin embargo, la necesidad de representar caracteres fuera del rango ASCII creció rápidamente, y los esquemas y protocolos URI a menudo no proporcionaban reglas estándar para preparar datos de caracteres para su inclusión en una URI. En consecuencia, las aplicaciones web comenzaron a usar diferentes codificaciones multibyte, con estado y otras no compatibles con ASCII como base para la codificación en porcentaje, lo que generó ambigüedades y dificultades para interpretar las URI de forma fiable.
Por ejemplo, muchos esquemas y protocolos URI basados en los RFC 1738 y 2396 presuponen que los caracteres de datos se convertirán a bytes según una codificación de caracteres no especificada antes de ser representados en un URI mediante caracteres no reservados o bytes codificados con porcentaje. Si el esquema no permite que el URI indique qué codificación se utilizó, o si la codificación entra en conflicto con el uso de ASCII para codificar con porcentaje los caracteres reservados y no reservados, entonces el URI no se puede interpretar de forma fiable. Algunos esquemas no tienen en cuenta la codificación en absoluto y, en su lugar, simplemente sugieren que los caracteres de datos se asignen directamente a los caracteres del URI, lo que deja a criterio de las implementaciones decidir si codificar con porcentaje los caracteres de datos que no pertenecen ni a los conjuntos reservados ni a los no reservados, y cómo hacerlo.
En ocasiones, los datos de caracteres arbitrarios se codifican mediante porcentajes y se utilizan en situaciones que no son URI, como por ejemplo para programas de ofuscación de contraseñas u otros protocolos de traducción específicos del sistema.
Estándar actual
La sintaxis genérica de URI recomienda que los nuevos esquemas de URI que permitan la representación de datos de caracteres en una URI representen, en efecto, los caracteres del conjunto no reservado sin traducción y conviertan todos los demás caracteres a bytes según UTF-8 , para luego codificar esos valores en porcentaje. Esta sugerencia se introdujo en enero de 2005 con la publicación del RFC 3986. Los esquemas de URI introducidos antes de esta fecha no se ven afectados.
La especificación actual no aborda qué hacer con los datos de caracteres codificados. Por ejemplo, en informática, los datos de caracteres se manifiestan codificados en algún nivel y, por lo tanto, podrían tratarse como datos binarios o de caracteres al asignarlos a caracteres URI. Presumiblemente, corresponde a las especificaciones del esquema URI contemplar esta posibilidad y exigir una u otra opción, pero en la práctica, pocas, si acaso alguna, lo hacen.
Implementaciones no estándar
Existe una codificación no estándar para caracteres Unicode: , donde xxxx es una unidad de código UTF-16 representada como cuatro dígitos hexadecimales. Por ejemplo, la 13.ª edición de ECMA-262 incluye una función que utiliza esta sintaxis. [ 4 ] Sin embargo, este comportamiento no está especificado por ningún RFC y ha sido rechazado por el W3C. [ 5 ]%uxxxxescape
El tipo aplicación/x-www-form-urlencoded
Cuando se envían datos introducidos en formularios HTML , los nombres y valores de los campos del formulario se codifican y se envían al servidor en un mensaje de solicitud HTTP mediante el método GET o POST , o, históricamente, por correo electrónico . [ nb 1 ] La codificación utilizada por defecto se basa en una versión anterior de las reglas generales de codificación porcentual de URI, [ 6 ] con varias modificaciones, como la normalización de saltos de línea y la sustitución de espacios por +en lugar de %20. El tipo de medio de datos codificados de esta forma es application/x-www-form-urlencoded, y actualmente está definido en las especificaciones HTML y XForms . Además, la especificación CGI contiene reglas sobre cómo los servidores web decodifican datos de este tipo y los ponen a disposición de las aplicaciones.
Cuando se envían datos de un formulario HTML en una solicitud HTTP GET, estos se incluyen en el componente de consulta del URI de la solicitud utilizando la misma sintaxis descrita anteriormente. Cuando se envían en una solicitud HTTP POST o por correo electrónico, los datos se colocan en el cuerpo del mensaje y application/x-www-form-urlencodedse incluyen en el encabezado Content-Type del mismo.
Véase también
- Base64 : codificación para una secuencia de valores de bytes utilizando 64 caracteres imprimibles.
- Codificación de binario a texto : representación de datos binarios como texto.
- Identificador de recursos internacionalizado : conjunto ampliado de caracteres en el protocolo URI.
- Punycode : codificación para nombres de dominio Unicode
- Shellcode : código diseñado como carga útil para explotar una vulnerabilidad de software.
Notas
- ↑ La compatibilidad con agentes de usuario para el envío de formularios HTML por correo electrónico, utilizando una URL 'mailto'como acción del formulario, se propuso en la sección 5.6 de la RFC 1867 , durante la época de HTML 3.2. Varios navegadores web lo implementaron invocando un programa de correo electrónico independiente o utilizando sus propias capacidades SMTP rudimentarias . Aunque a veces poco fiable, gozó de cierta popularidad durante un breve periodo como una forma sencilla de transmitir datos de formularios sin necesidad de un servidor web niscripts CGI .
Referencias
- ↑ T. Berners-Lee ; L. Masinter ; M. McCahill (diciembre de 1994). Localizadores uniformes de recursos (URL) . Grupo de trabajo de redes. doi : 10.17487/RFC1738 . RFC 1738 .Obsoleto. sec. 2.2. Obsoleto por RFC 4248 y 4266. Actualizado por RFC 1808 , 2368 , 2396 , 3986 , 6196 , 6270 y 8089 .
- ↑ T. Berners-Lee ; R. Fielding ; L. Masinter (agosto de 1998). Identificadores uniformes de recursos (URI): sintaxis genérica . Grupo de trabajo de redes. doi : 10.17487/RFC2396 . RFC 2396 .Obsoleto. sec. 2.4. Obsoleto por RFC 3986. Actualizado por RFC 2732. Actualiza RFC 1808 y 1738 .
- ↑ T. Berners-Lee ; R. Fielding ; L. Masinter (enero de 2005). Identificador uniforme de recursos (URI): sintaxis genérica . Grupo de trabajo de redes. doi : 10.17487/RFC3986 . STD 66. RFC 3986 .Estándar de Internet 66. sec. 1.2.1, 2.1, 2.5. Deja obsoletos los RFC 2732 , 2396 y 1808. Actualizado por los RFC 6874 , 7320 y 8820. Actualiza el RFC 1738 .
- ↑ "Especificación del lenguaje ECMAScript 2017 (ECMA-262, 8.ª edición, junio de 2017)" . Ecma International. Archivado del original el 2 de julio de 2018. Consultado el 20 de junio de 2018 .
- ^ Duerst, Martín; Suignard, Michel (30 de noviembre de 2004). "Identificadores de recursos internacionalizados (IRI)" . w3.org . Consultado el 17 de septiembre de 2025 .
- ↑ Berners-Lee, Tim (junio de 1994). Identificadores universales de recursos en la WWW: una sintaxis unificadora para la expresión de nombres y direcciones de objetos en la red tal como se utilizan en la World Wide Web . Grupo de trabajo de redes. doi : 10.17487/RFC1630 . RFC 1630 .Informativo.
Enlaces externos
Las siguientes especificaciones tratan y definen, de una forma u otra, los caracteres reservados, los caracteres no reservados y la codificación porcentual:
- RFC 3986 / STD STD 66 . IETF . (más erratas ), la especificación actual de sintaxis genérica de URI.
- Los RFC 2396 (obsoleto, más erratas ) y RFC 2732 (más erratas ) conformaban conjuntamente la versión anterior de la especificación de sintaxis URI genérica.
- RFC 1738 (en su mayoría obsoleto) y RFC 1808 (obsoleto), que definen las URL .
- RFC 1630 (obsoleto), la primera especificación de sintaxis URI genérica.
- "Nomenclatura y direccionamiento: URI, URL, ..." W3C . Consultado el 17 de septiembre de 2025 .(pauta)
- "Programas de codificación URI" . W3C . Consultado el 17 de septiembre de 2025 .(Explicación del W3C sobre UTF-8 en URI; la página ya no se actualiza y puede contener información inexacta).
- "Formularios" . W3C . Consultado el 17 de septiembre de 2025 .(Tipos de contenido de formularios HTML del W3C)
- esquemas URI
- Estándares de Internet
- Formatos de codificación de binario a texto
