Pregunta ¿Por qué encodeURIComponent no codifica comillas simples / apóstrofes?


los escapar() función, se desaprobó y se reemplazó por encodeURIComponent pero encodeURIComponent no codifica el carácter de comilla simple / apóstrofo. Que necesito para escapar de los apóstrofes en el apellido de una persona (por ejemplo, 'O'Neill') en una forma AJAX. ¿Por qué eliminarían la capacidad de algo que estaban tratando de mejorar?

EDITAR:

Así que aquí hay un ejemplo de código para explicar el problema más a fondo. Como puede ver, el apellido 'O'Neill' contiene un apóstrofo que debe escaparse al pasar la variable en la url. Pero esto también sucedería en otros lugares en la forma, por ejemplo, si una dirección ingresada fuera 'Billy's Tavern'.

<input id='surname' value="O'Neill">                        
<script>
var get_url = '?surname='+encodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

Mi solución actual, usando una función personalizada. Mi pregunta era solo preguntar por qué hay una necesidad de una función personalizada.

<script>
function customEncodeURIComponent(URI) {
    return encodeURIComponent(URI).replace(/'/g, "%27");
}
</script>

<input id='surname' value="O'Neill">
<script>
var get_url = '?surname='+customEncodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

32
2017-08-15 11:04


origen


Respuestas:


encodeURIComponent escapa a todos los personajes excepto a los siguientes:

alfabético, dígitos decimales, - _. ! ~ * '()

Si desea utilizar una codificación compatible con RFC 3986 (que se reserva !, ', (, )y *), puedes usar:

function rfc3986EncodeURIComponent (str) {  
    return encodeURIComponent(str).replace(/[!'()*]/g, escape);  
}

Puede obtener más información sobre esto en MDN.

ACTUALIZAR:

Para responder a su pregunta, sobre por qué ' y los otros caracteres mencionados anteriormente no están codificados por encodeURIComponent, la respuesta breve es que solo necesitan ser codificados en ciertos esquemas de URI y la decisión de codificarlos depende del esquema que está utilizando.

Citar RFC 3986:

Las aplicaciones que producen URI deben codificar por ciento los octetos de datos que   corresponden a los personajes en el reserved set a menos que estos personajes   están específicamente permitidos por el esquema de URI para representar datos en ese   componente. Si se encuentra un carácter reservado en un componente URI y no   la función de delimitación se conoce para ese personaje, entonces debe ser   interpretado como representando el octeto de datos correspondiente a ese   codificación del personaje en US-ASCII.

Donde "conjunto reservado" se define como

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

Apostrophe está en el sub-delims grupo. En otras palabras, debe dejar estos caracteres sin codificar especialmente si está seguro de que las aplicaciones consumidoras sabrán qué hacer con ellas: por ejemplo, si codificó por error ? y & ya no delimitarán las partes de consulta. Históricamente, también hubo una propuesta de parámetros de segmentos de ruta delimitados con ; y , (no obtuvo una gran adopción), por lo que estos personajes también están permitidos. No es que apostrohe sea "de uso libre" (es decir, unreserved) en datos de URI, pero se asumió que tendrá algún significado especial en el contexto de URI, por ejemplo, segment parte:

segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

40
2017-08-15 11:26



prueba esto

encodeURIComponent(str).replace(/'/g, "%27");

los /char/g la sintaxis le dice a JavaScript que reemplace todas las ocurrencias en su cadena


4
2017-08-15 11:08



Vi que hay el mismo problema con los caracteres: " y \ así que eso es lo que funcionó para mí:

var replaceChars={ '\\':'\\\\' , '"':'\\"' };
encodeURIComponent(str.replace(/\\|"/gi, function(matched){
    return replaceChars[matched];
})),

0
2018-01-28 08:29



esto me ayuda:

replace(/'/g, '%60')

% 60 es `, pero de alguna manera se define como una comilla simple.


-1
2017-12-24 22:03