Maison > interface Web > js tutoriel > le corps du texte

Comment décoder les chaînes Base64 en JavaScript tout en gérant l'encodage UTF-8 ?

Barbara Streisand
Libérer: 2024-11-01 13:10:02
original
452 Les gens l'ont consulté

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

Décoder Base64 à l'aide de la fonction JavaScript atob : gestion de l'UTF-8

La fonction atob() de JavaScript est conçue pour décoder les chaînes codées en base64. Les utilisateurs peuvent rencontrer des problèmes lors du décodage des chaînes codées en UTF-8, ce qui entraîne des caractères codés en ASCII au lieu d'une représentation UTF-8 appropriée.

Défi : Comprendre le problème Unicode

Base64 attend des données binaires en entrée , et JavaScript considère les chaînes dont les caractères occupent un octet comme des données binaires. Cependant, les caractères occupant plus d'un octet dans les chaînes codées en UTF-8 déclenchent des exceptions lors du codage.

Solution 1 : Interopérabilité binaire

La solution recommandée consiste à encoder et décoder des chaînes binaires :

Encodage d'UTF-8 en binaire

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)));
}
Copier après la connexion

Décodage de binaire en UTF-8

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));
}
Copier après la connexion

Cette solution convertit la chaîne UTF-8 d'origine en une représentation binaire, en préservant l'encodage UTF-16, une représentation native en JavaScript.

Solution 2 : Interopérabilité ASCII Base64

Une solution alternative axée sur l'interopérabilité UTF-8 consiste à conserver les chaînes en texte brut base64 :

Encodage d'UTF-8 en Base64

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

Décodage de Base64 en UTF-8

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

Cette solution gère efficacement les chaînes codées en UTF-8 sans altérer leur représentation.

Prise en charge de 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(''))
}
Copier après la connexion

Solution historique (obsolète)

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

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}
Copier après la connexion

Bien que toujours fonctionnelle, cette approche est désormais obsolète dans les navigateurs modernes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!