이름 atob 그리고 btoa 일반적인 텍스트 변환을 제안할 수 있습니다. 브라우저 계약은 더 좁습니다. Base64 텍스트와 문자 값이 개별 바이트를 나타내는 문자열 사이를 변환합니다. 해당 바이트 문자열은 결과가 읽을 수 있는 유니코드 텍스트라는 약속이 아니라 컨테이너입니다.
두 개의 다른 문자열
JavaScript 문자열은 UTF-16 코드 단위를 사용합니다. 바이트 문자열은 의도적으로 각 문자 값을 0~255로 제한합니다. btoa('Hello') ASCII 값이 해당 범위에 맞기 때문에 작동합니다. btoa('你好') 해당 문자가 1바이트에 맞지 않기 때문에 실패합니다. 적합한 캐릭터라도 오해의 소지가 있을 수 있습니다. btoa('é') 많은 서비스에서 예상되는 UTF-8 바이트 C3 A9가 아닌 단일 바이트 E9를 인코딩합니다.
console.log(btoa('é')); // 6Q== (byte E9)
console.log(btoa(String.fromCharCode(0xc3, 0xa9))); // w6k= (UTF-8)
바이트 함수 주위에 UTF-8 변환을 넣습니다.
TextEncoder 텍스트에서 UTF-8 바이트를 생성합니다. Base64을 디코딩한 후 치명적인 TextDecoder 유효한 UTF-8 바이트를 다시 텍스트로 변환하고 잘못된 시퀀스를 자동으로 바꾸는 대신 거부합니다. 이 작은 예는 경계가 보이도록 의도적으로 명시적입니다.
const text = '中文😊';
const bytes = new TextEncoder().encode(text);
let binary = '';
for (const byte of bytes) binary += String.fromCharCode(byte);
const encoded = btoa(binary);
console.log(encoded); // 5Lit5paH8J+Yig==
const decodedBytes = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));
const decoded = new TextDecoder('utf-8', { fatal: true }).decode(decodedBytes);
console.log(decoded); // 中文😊
바이너리 결과를 깨진 문자열로 취급하지 마세요
atob('/w==') FF 바이트를 나타냅니다. UTF-8 자체로는 유효하지 않지만 완벽하게 유효한 이진 데이터입니다. 올바른 다음 작업은 다른 텍스트 변환 트릭이 아닌 바이트 다운로드 또는 16진수 보기일 수 있습니다. 해당 바이트 문자열을 통해 실행 TextEncoder U+00FF 문자를 인코딩하고 바이트를 변경합니다.
브라우저 디코더도 완전한 프로토콜 유효성 검사기가 아닙니다. 허용되는 공백과 생략된 패딩은 엄격한 애플리케이션 요구 사항과 다를 수 있습니다. 프로토콜에 표준 인코딩이 필요한 경우 알파벳, 패딩 및 사용되지 않은 비트를 별도로 검증하십시오. 대용량 파일의 경우 전체 바이트 배열을 다음으로 분산시키지 마십시오. String.fromCharCode(...bytes); 인수 수 제한은 파일이 비정상적으로 커지기 오래 전에 실패할 수 있습니다.
브라우저 계약을 읽어보세요. MDN: atob() 그리고 MDN: btoa(). 애플리케이션은 동일한 작업이라고 가정하기보다는 허용된 변환, 엄격한 유효성 검사기 또는 파일 보존 워크플로를 원하는지 결정해야 합니다.