Failed to execute ‘atob’ on ‘Window’

publicado por: Anonymous

Estoy enviando la siguiente cadena "Búsqueda no encontrada" al enviarla sin la ú la toma perfectamente, pero cuando va con ú sale el siguiente error:

Uncaught DOMException: Failed to execute ‘atob’ on ‘Window’: The string to be decoded is not correctly encoded.

El codigo js es el siguiente:

 w._getParameterByName = function (name) {
    name = name.replace(/[[]/, "\[").replace(/[]]/, "\]");
    var regex = new RegExp("[\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : atob(decodeURIComponent(results[1].replace(/+/g, " ")));
};

Agradezco su ayuda

solución

El problema es que tanto atob como btoa solo admiten caracteres que ocupan 1 byte y ú es un caracter utf8 de 16 bits, es decir, ocupa 2 bytes y genera el error.

Si puedes codificar correctamente, pero el problema es al decodificar, es probable que se deba a la forma en que lo estás haciendo, tal vez baste con colocar atob dentro:

return results === null ? "" : decodeURIComponent(atob(results[1]).replace(/+/g, " "));

La solución propuesta por Mozilla Developer es codificar la cadena, de forma que se pueda asegurar que todos los caracteres ocupen solo 1 byte:

_x000D_

_x000D_

// Convertir cadena Unicode a cadena donde cada
// elemento 16-bit ocupe solo un byte
function toBinary(string) {
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i < codeUnits.length; i++) {
    codeUnits[i] = string.charCodeAt(i);
  }
  return String.fromCharCode(...new Uint8Array(codeUnits.buffer));
}

// Recodificar cadena original
function fromBinary(binary) {
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i < bytes.length; i++) {
    bytes[i] = binary.charCodeAt(i);
  }
  return String.fromCharCode(...new Uint16Array(bytes.buffer));
}

// Cadena que contiene caracteres que ocupan más de 1 byte
const myString = "Búsqueda no encontrada";

// Primero se "escapan" los caracteres especiales
const converted = toBinary(myString);
// Después ya se puede codificar a base64
const encoded = btoa(converted);
console.log(encoded); // QgD6AHMAcQB1AGUAZABhACAAbgBvACAAZQBuAGMAbwBuAHQAcgBhAGQAYQA=

// Primero de codificas de base64
const decoded = atob(encoded);
// "Recuperar" caracteres especiales
const original = fromBinary(decoded);
console.log(original);  // Búsqueda no encontrada

_x000D_

_x000D_

_x000D_

Actualización:

Si estás codificando en base64 desde PHP la opción puede ser bastante sencilla:

<?php
// Convierte primero a ISO-6859-1 y codifica en base 64
echo base64_encode(utf8_decode('Búsqueda no encontrada'));
// Salida: QvpzcXVlZGEgbm8gZW5jb250cmFkYQ==

Luego, con javascript solo usas atob() para recuperar la cadena original:

_x000D_

_x000D_

console.log(atob('QvpzcXVlZGEgbm8gZW5jb250cmFkYQ=='));

_x000D_

_x000D_

_x000D_

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *