«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как декодировать строки Base64 в JavaScript при обработке кодировки UTF-8?

Как декодировать строки Base64 в JavaScript при обработке кодировки UTF-8?

Опубликовано 9 ноября 2024 г.
Просматривать:369

How to Decode Base64 Strings in JavaScript While Handling UTF-8 Encoding?

Декодирование Base64 с использованием функции atob JavaScript: обработка UTF-8

Функция atob() JavaScript предназначена для декодирования строк в кодировке Base64. Пользователи могут столкнуться с проблемами при декодировании строк в кодировке UTF-8, в результате чего символы в кодировке ASCII вместо правильного представления UTF-8.

Задача: понимание проблемы Юникода

Base64 ожидает на входе двоичные данные , а JavaScript рассматривает строки с символами, занимающими один байт, как двоичные данные. Однако символы, занимающие более одного байта в строках с кодировкой UTF-8, вызывают исключения во время кодирования.

Решение 1. Двоичная совместимость

Рекомендуемое решение — кодировать и декодировать двоичные строки:

Кодирование 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