Вы можете закодировать его, сначала экранировав, а затем вызвав для него EncodeUriComponent.
Это выглядит так:
btoa(unescape(encodeURIComponent('?')));
Приведенный выше эмодзи вернул бы "8J + Ygg =="
Чтобы декодировать его, вы должны сделать это
decodeURIComponent(escape(window.atob('8J+Ygg==')));
Вы можете сделать две функции, которые немного упростят эту задачу:
//Encode
function utoa(str) {
return window.btoa(unescape(encodeURIComponent(str)));
}
//Decode
function atou(str) {
return decodeURIComponent(escape(window.atob(str)));
}
Источник: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa