Heim >Web-Frontend >js-Tutorial >Wie dekodiere ich Base64-Strings in JavaScript bei gleichzeitiger UTF-8-Codierung?

Wie dekodiere ich Base64-Strings in JavaScript bei gleichzeitiger UTF-8-Codierung?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 13:10:02554Durchsuche

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

Base64 mithilfe der JavaScript-atob-Funktion dekodieren: Umgang mit UTF-8

Die atob()-Funktion von JavaScript dient zum Dekodieren von Base64-kodierten Zeichenfolgen. Benutzer können beim Dekodieren von UTF-8-kodierten Zeichenfolgen auf Probleme stoßen, was zu ASCII-kodierten Zeichen anstelle der korrekten UTF-8-Darstellung führt.

Herausforderung: Das Unicode-Problem verstehen

Base64 erwartet Binärdaten als Eingabe , und JavaScript betrachtet Zeichenfolgen, deren Zeichen ein Byte belegen, als Binärdaten. Zeichen, die mehr als ein Byte in UTF-8-codierten Zeichenfolgen belegen, lösen jedoch Ausnahmen während der Codierung aus.

Lösung 1: Binäre Interoperabilität

Die empfohlene Lösung besteht darin, binäre Zeichenfolgen zu codieren und zu decodieren:

UTF-8 in Binär kodieren

function toBinary(string) {
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i < codeUnits.length; i++) {
    codeUnits[i] = string.charCodeAt(i);
  }
  return btoa(String.fromCharCode(...new Uint8Array(codeUnits.buffer)));
}

Binär in UTF-8 dekodieren

function fromBinary(encoded) {
  const binary = atob(encoded);
  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));
}

Diese Lösung konvertiert die ursprüngliche UTF-8-Zeichenfolge in eine binäre Darstellung, wobei die UTF-16-Kodierung, eine native Darstellung in JavaScript, erhalten bleibt.

Lösung 2: ASCII Base64-Interoperabilität

Eine alternative Lösung, die sich auf die UTF-8-Interoperabilität konzentriert besteht darin, Klartext-Base64-Zeichenfolgen beizubehalten:

Codierung von UTF-8 in Base64

function b64EncodeUnicode(str) {    
  return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
    function toSolidBytes(match, p1) {
      return String.fromCharCode('0x' + p1);
  }));
}

Decodierung von Base64 in UTF-8

function b64DecodeUnicode(str) {
  return decodeURIComponent(atob(str).split('').map(function(c) {
    return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  }).join(''));
}

Diese Lösung verarbeitet effizient UTF-8-codierte Zeichenfolgen, ohne deren Darstellung zu ändern.

TypeScript-Unterstützung

// 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(''))
}

Historische Lösung (veraltet)

function utf8_to_b64( str ) {
  return window.btoa(unescape(encodeURIComponent( str )));
}

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

Obwohl dieser Ansatz immer noch funktionsfähig ist, ist er in modernen Browsern inzwischen veraltet.

Das obige ist der detaillierte Inhalt vonWie dekodiere ich Base64-Strings in JavaScript bei gleichzeitiger UTF-8-Codierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn