
Кодировка (encoding) и декодирование (decoding) в Base64 — распространенный способ преобразования двоичных данных в безопасный текст. Он часто используется в Data URL, таких как встроенные (inline) изображения.
Прим. пер.: с помощью data URL можно решить проблему (ошибку) отсутствующей фавиконки в браузере.
<link rel="icon" href="data:." />Что происходит при кодировке и декодировании в base64 строк в JS? В этой статье мы рассмотрим некоторые особенности и ловушки, связанные с этими процессами.
btoa() и atob()
Основными функциями для кодировки и декодирования строк в base64 в JS являются btoa() и atob(), соответственно. btoa() (binary to ASCII) кодирует строку в base64, а atob() (ASCII to binary) декодирует.
Пример:
// Обычная строка, состоящая из кодовых точек (code points) ниже 128.
const asciiString = 'hello';
// Работает
const asciiStringEncoded = btoa(asciiString);
console.log(`Encoded string: [${asciiStringEncoded}]`);
// Encoded string: [aGVsbG8=]
// Работает
const asciiStringDecoded = atob(asciiStringEncoded);
console.log(`Decoded string: [${asciiStringDecoded}]`);
// Decoded string: [hello]К сожалению, как отмечается в статье MDN, это работает только со строками, содержащими символы ASCII или символы, которые могут быть представлены одним байтом. Другими словами, это не будет работать с Unicode.
Рассмотрим следующий пример:
// Строка, представляющая собой сочетание маленьких, средних и больших кодовых точек.
// Эта строка является валидным UTF-16.
// 'hello' состоит из кодовых точек ниже 128.
// '⛳' - это одна 16-битная кодовая единица.
// '❤️' - это две 16-битных кодовых единицы: U+2764 и U+FE0F (сердце и вариант (variant)).
// ' 