ホームページ > 記事 > ウェブフロントエンド > UTF-8 エンコーディングを処理しながら JavaScript で Base64 文字列をデコードするにはどうすればよいですか?
JavaScript の atob() 関数は、base64 でエンコードされた文字列をデコードするように設計されています。ユーザーは、UTF-8 でエンコードされた文字列をデコードするときに問題が発生し、適切な UTF-8 表現ではなく ASCII でエンコードされた文字が生成される可能性があります。
Base64 は入力としてバイナリ データを必要とします、JavaScript は 1 バイトを占める文字を含む文字列をバイナリ データとみなします。ただし、UTF-8 でエンコードされた文字列で複数のバイトを占める文字は、エンコード中に例外をトリガーします。
推奨される修正は、バイナリ文字列にエンコードしてデコードすることです。
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 のネイティブ表現を保持します。
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 でエンコードされた文字列の表現を変更せずに効率的に処理します。
// 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 サイトの他の関連記事を参照してください。