¿Por qué la cadena %e9 o %fd no es válida para decodificar usando decodeURIComponent de Javascript?
Estos caracteres aparecen en medio de una cadena y no puedo entender dónde está el problema. Son caracteres hexadecimales válidos.
Cadena completa (esto es parte de una cadena enviada por la aplicación del cliente al servidor y que estaba siendo bloqueada por modsec):
%61%e9%3d%36%7f%00%00%01%00%00%43%fd%a1%5a%00%00%00%43Muestra para decodificar:
decodeURIComponent("%61%e9%3d%36%7f%00%00%01%00%00%43%fd%a1%5a%00%00%00%43")Error:
VM222:1 Uncaught URIError: URI malformed at decodeURIComponent (<anonymous>) at <anonymous>:1:1Estoy usando estas dos funciones para codificar base64 y decodificar desde base64 (desde aquí: Mozilla ):
function c64(t) { return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, (match, p1) => { return String.fromCharCode('0x' + p1); })); } function d64(t) { return decodeURIComponent(atob(t).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); }La cadena original está en base64:
d64("Yek9Nn8AAAEAAEP9oVoAAABDYek9Nn8AAAEAAEP9oVoAAABD")devoluciones:
...js:1 Uncaught URIError: URI malformed at decodeURIComponent (<anonymous>)Esto se debe a que la representación Unicode de ese carácter en codificación hexadecimal no es "%e9" ni "%E9" .
Comience escribiendo en la consola: "\u00e9" o "\u00E9"
que es % reemplazado por "\u00" en su ejemplo. Conseguirás:
'é'
Puede verificar esto ejecutando:
escape('é') //"%E9".
ahora corre
encodeURIComponent('é')
y obtendrá "%C3%A9" no "%E9" . Esto se debe a que encodeURIComponent devuelve un volcado hexadecimal de bytes. Si el carácter es de 2 bytes, obtiene %xx%yy , si es de 3 bytes, obtiene %xx%yy%zz .
Prueba esto con "€" . Primero haz:
escape("€")
, obtendrá '%u20AC' o lo mismo que "\u20AC" .
Para obtener el volcado hexadecimal de su código de bytes, ejecute:
encodeURIComponent("€") y obtendrá '%E2%82%AC' .
Este ejemplo del artículo 'UTF-8' de Wikipedia explica en detalle cómo se calcula '%E2%82%AC' . Es el volcado hexadecimal de 11100010 10000010 10101100 .