위의 답변으로 인한 심이 작동했지만 데스크톱 브라우저의 구현 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
인스턴스는 기본적으로 UTF-8 로 인코딩 된 문자열을 나타내거나 해석 합니다. 반대로 데스크톱 Chrome에서는 latin1 범위를 벗어난 문자가 포함 된 문자열을 입력 할 수도 없습니다.btoa()
.Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
따라서, 당신은 명시 적으로 설정해야합니다 인코딩 형식 에 latin1
바탕 크롬의 인코딩 유형에 맞게 심은 당신의 Node.js를 위해서는 :
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])));