tôi thấy rằng mặc dù các miếng chêm từ các câu trả lời ở trên đã hoạt động, chúng không khớp với hành vi của việc triển khai các trình duyệt trên máy tính để bàn của btoa()
và atob()
:
const btoa = function(str){ return Buffer.from(str).toString('base64'); }
// returns "4pyT", yet in desktop Chrome would throw an error.
btoa('✓');
// returns "fsO1w6bCvA==", yet in desktop Chrome would return "fvXmvA=="
btoa(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
Khi nó quay ra, Buffer
trường hợp đại diện/giải thích các chuỗi được mã hóa theo UTF-8 by default. Ngược lại, ở máy tính để bàn của Chrome, bạn có thể thậm chí không đầu vào một chuỗi chứa ký tự bên ngoài của latin1 dao vào btoa()
, vì nó sẽ ném một ngoại lệ: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
Vì vậy, bạn cần phải thiết lập một cách rõ ràng encoding type-latin1
trong để cho shim Node.js của bạn để phù hợp với kiểu mã hóa của Chrome desktop:
const btoaLatin1 = function(str) { return Buffer.from(str, 'latin1').toString('base64'); }
const atobLatin1 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('latin1');}
const btoaUTF8 = function(str) { return Buffer.from(str, 'utf8').toString('base64'); }
const atobUTF8 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('utf8');}
btoaLatin1('✓'); // returns "Ew==" (would be preferable for it to throw error because this is undecodable)
atobLatin1(btoa('✓')); // returns "\u0019" (END OF MEDIUM)
btoaUTF8('✓'); // returns "4pyT"
atobUTF8(btoa('✓')); // returns "✓"
// returns "fvXmvA==", just like desktop Chrome
btoaLatin1(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
// returns "fsO1w6bCvA=="
btoaUTF8(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
Nguồn
2017-10-02 11:02:38
Cảm ơn! – Joey
Nếu nó giúp một ai đó, tôi đặt nó trong mocha common.js: '' 'global.btoa = function (str) {return new Buffer (str) .toString ('base64');};' '' để tôi có thể kiểm tra trong bảng điều khiển như thể tôi đã có trình duyệt. – snapfractalpop
Tuy nhiên, một khác biệt nhỏ giữa node.js và trình duyệt làm cho nó khó khăn hơn một chút để đạt được đẳng cấu. Cảm ơn câu trả lời, @mscdex, nó thực sự đã giúp! (trung thực!) – Swivel