javascript - parametros - ¿Debo usar encodeURI o encodeURIComponent para codificar URLs?
javascript escape (8)
¿Cuál de estos dos métodos debería usarse para codificar las URL?
Diferencia entre encodeURI
y encodeURIComponent
:
encodeURIComponent(value)
se usa principalmente para codificar los valores de los parámetros de queryString, y codifica cada carácter aplicable en value
. encodeURI
ignora el prefijo de protocolo ( http://
) y el nombre de dominio.
En casos muy, muy raros, cuando se desea implementar la codificación manual para codificar caracteres adicionales (aunque no es necesario que estén codificados en casos típicos) como ! *
! *
, entonces podrías usar:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!*]/g, function(c) {
return ''%'' + c.charCodeAt(0).toString(16);
});
}
( source )
Aquí hay un resumen.
escape () no codificará @ * _ + -. /
No lo uses.
encodeURI () no codificará AZ az 0-9; , /? : @ & = + $ - _. ! ~ * ''() #
Úselo cuando su entrada sea una URL completa como '' https://searchexample.com/search?q=wiki ''
- encodeURIComponent () no codificará AZ az 0-9 - _. ! ~ * ''() Úselo cuando su entrada sea parte de una URL completa, por ejemplo,
const queryStr = encodeURIComponent(someString)
Como regla general use encodeURIComponent
. No se asuste con el nombre largo pensando que es más específico en su uso, para mí es el método más utilizado. Además, no te dejes engañar por el uso de encodeURI porque lo probaste y parece que se está codificando correctamente, probablemente no sea lo que querías usar y, a pesar de que tu prueba simple de "Fred" en un campo de primer nombre funcionó, encontrarás más adelante, cuando utilice un texto más avanzado, como agregar un signo y un hashtag, fallará. Puedes ver las otras respuestas por las razones por las que esto es así.
Depende de lo que realmente quieras hacer.
encodeURI asume que la entrada es una URI completa que puede tener algunos caracteres que necesitan codificación.
encodeURIComponent codificará todo con un significado especial, por lo que lo usas para componentes de URI como
var world = "A string with symbols & characters that have special meaning?";
var uri = ''http://example.com/foo?hello='' + encodeURIComponent(world);
Otras respuestas describen los propósitos. Aquí están los caracteres que cada función convertirá :
control = ''/x00/x01/x02/x03/x04/x05/x06/x07/x08/x09/x0A/x0B/x0C/x0D/x0E/x0F''
+ ''/x10/x11/x12/x13/x14/X15/x16/x17/x18/x19/x1A/x1B/x1C/x1D/x1E/x1F''
+ ''/x7F''
encodeURI (control + '' "%<>[//]^`{|}'' )
encodeURIComponent(control + '' "%<>[//]^`{|}'' + ''#$&,:;=?'' + ''+/@'' )
escape (control + '' "%<>[//]^`{|}'' + ''#$&,:;=?'' + "!''()~")
Todos los caracteres anteriores se convierten en códigos porcentuales-hexadecimales. Espacio a %20
, porcentaje a %25
, etc. Los siguientes caracteres pasan sin cambios.
Aquí están los caracteres que las funciones NO convertirán :
pass_thru = ''*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz''
encodeURI (pass_thru + ''#$&,:;=?'' + ''+/@'' + "!''()~")
encodeURIComponent(pass_thru + "!''()~")
escape (pass_thru + ''+/@'' )
Si está codificando una cadena para colocar en un componente de URL (un parámetro de cadena de consulta), debe llamar a encodeURIComponent
.
Si está codificando una URL existente, llame a encodeURI
.
encodeURIComponent (): asume que su argumento es una parte (como el protocolo, nombre de host, ruta o cadena de consulta) de un URI. Por lo tanto, escapa a los caracteres de puntuación que se utilizan para separar las partes de un URI.
encodeURI (): se utiliza para codificar url existente
xkr.us tiene una gran discusión, con ejemplos. Para citar su resumen:
El método de escape () no codifica el carácter + que se interpreta como un espacio en el lado del servidor, así como generado por formularios con espacios en sus campos. Debido a este inconveniente y al hecho de que esta función no puede manejar correctamente los caracteres que no son ASCII, debe evitar el uso de escape () siempre que sea posible. La mejor alternativa suele ser encodeURIComponent ().
escape () no codificará: @ * / +
El uso del método encodeURI () es un poco más especializado que escape () en el sentido de que codifica los URI en lugar de la cadena de consulta, que forma parte de una URL. Utilice este método cuando necesite codificar una cadena que se usará para cualquier recurso que use URI y necesite que ciertos caracteres permanezcan sin codificar. Tenga en cuenta que este método no codifica el carácter '', ya que es un carácter válido dentro de los URI.
encodeURI () no codificará: ~! @ # $ & * () =: /,;? + ''
Por último, el método encodeURIComponent () debe utilizarse en la mayoría de los casos cuando se codifica un componente único de un URI. Este método codificará ciertos caracteres que normalmente se reconocerían como caracteres especiales para los URI, de modo que se puedan incluir muchos componentes. Tenga en cuenta que este método no codifica el carácter '', ya que es un carácter válido dentro de los URI.
encodeURIComponent () no codificará: ~! * () ''