ホームページ >ウェブフロントエンド >jsチュートリアル >UTF-8 エンコーディングを処理しながら JavaScript で Base64 文字列をデコードするにはどうすればよいですか?

UTF-8 エンコーディングを処理しながら JavaScript で Base64 文字列をデコードするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 13:10:02549ブラウズ

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

JavaScript atob 関数を使用した Base64 のデコード: UTF-8 の処理

JavaScript の atob() 関数は、base64 でエンコードされた文字列をデコードするように設計されています。ユーザーは、UTF-8 でエンコードされた文字列をデコードするときに問題が発生し、適切な UTF-8 表現ではなく ASCII でエンコードされた文字が生成される可能性があります。

課題: Unicode の問題を理解する

Base64 は入力としてバイナリ データを必要とします、JavaScript は 1 バイトを占める文字を含む文字列をバイナリ データとみなします。ただし、UTF-8 でエンコードされた文字列で複数のバイトを占める文字は、エンコード中に例外をトリガーします。

解決策 1: バイナリの相互運用性

推奨される修正は、バイナリ文字列にエンコードしてデコードすることです。

UTF-8 をバイナリにエンコードする

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)));
}

バイナリを 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));
}

このソリューションは次のように変換します元の 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 )));
}

このアプローチはまだ機能しますが、最新のブラウザーでは非推奨になりました。

以上がUTF-8 エンコーディングを処理しながら JavaScript で Base64 文字列をデコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。