मैंने पाया कि हालांकि शिम्स ऊपर दिए गए उत्तरों से, वे btoa()
और 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])));
जैसा कि यह पता चला है, Buffer
उदाहरण यूटीएफ -8 by default में एन्कोड किए गए तारों का प्रतिनिधित्व/व्याख्या करते हैं। इसके विपरीत, डेस्कटॉप Chrome में, आप इनपुट भी नहीं एक स्ट्रिंग है latin1 के बाहर वर्ण हैं btoa()
में, सीमा के रूप में यह एक अपवाद फेंक होगा कर सकते हैं: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
इसलिए, आप स्पष्ट रूप से latin1
को encoding type में निर्धारित करने की आवश्यकता
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])));
स्रोत
2017-10-02 11:02:38
धन्यवाद कि काम किया! – Joey
अगर यह किसी की मदद करता है, तो मैंने इसे अपने mocha में रखा। Commons: '' 'global.btoa = function (str) {वापसी नया बफर (str) .toString ('base64');};' '' ' कंसोल में परीक्षण कर सकते हैं जैसे कि मेरे पास ब्राउजर था। – snapfractalpop
फिर भी node.js और ब्राउज़र के बीच एक और मामूली अंतर जो इसे आइसोमोर्फिज्म प्राप्त करने के लिए थोड़ा और कठिन बनाता है। उत्तर के लिए धन्यवाद, @mscdex, यह वास्तव में मदद की! (ईमानदारी से!) – Swivel