Функция atob() JavaScript предназначена для декодирования строк в кодировке Base64. Пользователи могут столкнуться с проблемами при декодировании строк в кодировке UTF-8, в результате чего символы в кодировке ASCII вместо правильного представления UTF-8.
Base64 ожидает на входе двоичные данные , а JavaScript рассматривает строки с символами, занимающими один байт, как двоичные данные. Однако символы, занимающие более одного байта в строках с кодировкой UTF-8, вызывают исключения во время кодирования.
Рекомендуемое решение — кодировать и декодировать двоичные строки:
Кодирование UTF-8 в двоичный формат
function toBinary(string) { const codeUnits = new Uint16Array(string.length); for (let i = 0; iДекодирование двоичного кода в UTF-8
function fromBinary(encoded) { const binary = atob(encoded); const bytes = new Uint8Array(binary.length); for (let i = 0; iЭто решение преобразует исходную строку UTF-8 в двоичное представление, сохраняя кодировку UTF-16, собственное представление в JavaScript.
Решение 2: совместимость ASCII Base64
Альтернативным решением, ориентированным на совместимость UTF-8, является поддержка строк в формате Base64 в виде открытого текста:
Кодирование UTF-8 в Base64
function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' p1); })); }Декодирование Base64 в UTF-8
function b64DecodeUnicode(str) { return decodeURIComponent(atob(str).split('').map(function(c) { return '%' ('00' c.charCodeAt(0).toString(16)).slice(-2); }).join('')); }Это решение эффективно обрабатывает строки в кодировке UTF-8 без изменения их представления.
Поддержка TypeScript
// Encoding UTF-8 ⇢ base64 function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode(parseInt(p1, 16)) })) } // Decoding base64 ⇢ UTF-8 function b64DecodeUnicode(str) { return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) { return '%' ('00' c.charCodeAt(0).toString(16)).slice(-2) }).join('')) }Историческое решение (устарело)
function utf8_to_b64( str ) { return window.btoa(unescape(encodeURIComponent( str ))); } function b64_to_utf8( str ) { return decodeURIComponent(escape(window.atob( str ))); }Несмотря на то, что этот подход все еще работает, в современных браузерах он устарел.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3