Javascript의 atob을 사용하여 base64를 디코딩하면 utf-8 문자열이 제대로 디코딩되지 않습니다.
Javascript의 window.atob() 함수는 1바이트 이상을 차지하는 문자를 처리할 때 UTF-8 문자열을 올바르게 디코딩하지 못하여 대신 ASCII로 인코딩된 문자가 생성됩니다.
유니코드 문제
JavaScript 문자열이 인코딩됩니다. 16비트 단위이며 btoa()는 이진 데이터를 입력으로 예상합니다. 특수 문자나 외부 문자와 같이 1바이트 이상을 차지하는 문자는 이진 데이터로 간주되지 않으며 btoa()에 전달될 때 오류를 유발합니다. 이 문제는 "유니코드 문제"로 알려져 있습니다.
이진 상호 운용성을 갖춘 솔루션
MDN에서 권장하는 솔루션은 이진 문자열 표현으로 인코딩하고 디코딩하는 것입니다. 이는 데이터의 바이너리 특성을 보존하고 유니코드 문제를 제거합니다. 인코딩 프로세스에는 Uint16Array 및 Uint8Array를 사용하여 UTF-8 문자열을 이진 문자열로 변환하는 작업이 포함됩니다. 디코딩에는 이진 문자열을 다시 UTF-8 문자열로 변환하는 작업이 포함됩니다.
ASCII Base64 상호 운용성을 갖춘 솔루션
또 다른 솔루션은 UTF-16 DOMString을 8로 변환하는 것입니다. - Uint8Array를 사용하여 문자의 비트 정수 배열을 만든 다음 btoa()를 사용하여 인코딩합니다. 이 방법은 UTF-8 기능을 유지하고 UTF-8을 지원하는 플랫폼에서 디코딩할 수 있는 일반 텍스트 base64 문자열을 생성합니다. 디코딩에는 atob() 및 decodeURIComponent()를 사용하여 base64 문자열을 다시 UTF-8 문자열로 변환하는 작업이 포함됩니다.
사용되지 않는 솔루션
이전에 사용된 솔루션은 escape( ) 및 unescape() 함수는 이제 더 이상 사용되지 않습니다. 이 방법은 최신 브라우저에서 여전히 작동하지만 사용을 권장하지 않습니다.
또한 GitHub API로 작업할 때 올바르게 작동하려면 디코딩하기 전에 base64 소스에서 공백을 제거해야 할 수도 있다는 점에 유의할 가치가 있습니다. 모바일 사파리.
위 내용은 JavaScript에서 `atob()`가 UTF-8 문자열을 디코딩하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!