[요약] 자바스크립트에서의 base64 인코딩

자바스크립트의 인코딩에 관련하여 좋은 포스팅이 있어 요약해보았습니다.
(코드 부분을 함께 읽으면 좋기에 아래 첨부한 포스팅을 읽어보시는걸 추천합니다!)


참고문헌


https://velog.io/@superlipbalm/base64-encoding


요약


btoa(), atob()


  • js 에서 base64 인코딩 및 디코딩을 위한 핵심 함수입니다.

  • btoa() : 문자열 -> base 64

  • atob() : base64 -> 문자열

  • 이 기능은 ASCII 문자 또는 단일 바이트로 표현할 수 있는 문자가 포함된 문자열에서만 동작합니다
    (유니코드에서는 작동안함)


유니코드와 자바스크립트에서의 문자열


  • 유니코드 : 문자 인코딩의 글로벌 표준이며, 특정 문자에 숫자를 할당합니다

  • 이러한 숫자를 ‘코드 포인트’ 라고 합니다.

  • 코드 포인트를 컴퓨터가 어디서든 일관되게 해석할 수 있도록 바이트 시퀀스로 만드는 두가지 방법이 있는데, 이를 UTF-8, UTF-16 이라 하며,

  • UTF - 8 : 1바이트~4바이트(바이트당 6비트)를 코드포인트가 사용가능합니다.

  • UTF - 16: 항상 2바이트(16비트)로 처리합니다.

  • 자바스크립트는 문자열을 UTF-16으로 처리합니다.

  • 즉, btoa()사용을 통해 제대로 인코딩 되지 않다면, 이는 utf-16 의 단일 바이트를 넘어서는 문자를 base64로 인코딩하려고 했기에 생겨난 문제입니다.


TextEncoder, TextDecoder 사용


  • 유니코드를 인코딩할 때 발생하는 문제를 아래와 같은 순서로 해결할 수 있습니다.

  • (아래 참고문헌 참조) TextEncoder를 통해 UTF-16 -> UTF-8 변경(Uint8Array)합니다.

  • String.fromCodePoint()를 통해 Uint8Array -> 각 바이트를 코드포인트로 처리하여 모두 단일 바이트로 표현할 수 있는 코드 포인트 문자열 생성합니다.

  • 반대과정인 디코딩도 동일합니다


TextEncoder, TextDecoder 사용시 유의할점 (론 서로게이트 문제)


  • 문제가 있다면, 예를 들어 치즈 이모지의 코드포인트는 129472 인데, 16비트의 최대 숫자는 65535이기에 최대치를 넘겨버렸습니다.

  • 자바스크립트의 UTF-16 에서는 이를 처리할 때 문제가 있습니다. (론 서로게이트 문제)

  • 이에 에러를 표현해주어야 하는데, TextDecoder 에서는 이를 다른 문자열로 자동적으로 대체해버립니다.

  • 이를 확인하기 위해서는 isWellFormed() 라는 함수가 있습니다.

  • 문자열에 론 서로게이트가 포함되어있다면 에러를 발생시키게 됩니다.

  • 브라우저에서 isWellFormed 를 지원하지 않는다면 encodeURIComponent를 사용해도 괜찮습니다.

(번역) 자바스크립트에서 base64 문자열 인코딩의 미묘한 차이

velog.io

(번역) 자바스크립트에서 base64 문자열 인코딩의 미묘한 차이

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 11월 27일 오전 1:01

댓글 0

    함께 읽은 게시물

    기업에서 리더의 위치에 올랐다고 해서 모두 훌륭한 리더가 되는 것은 아니다. 기업을 이끄는 리더의 위치에 있는 사람치고 더 나은 실적을 목표로 하지 않는 경우는 없지만 말처럼 쉽지 않다. 더 나은 실적은 리더 혼자의 힘으로 이뤄지는 것이 아니기 때문이다.

    ... 더 보기

    [초점] '조직에 도움 안되는 나쁜 리더'의 5가지 공통점 - 글로벌이코노믹

    글로벌이코노믹

    [초점] '조직에 도움 안되는 나쁜 리더'의 5가지 공통점 - 글로벌이코노믹

    조회 211


    💥불안한 3040직장인을 위한 환승 이직 코칭!

    ... 더 보기


    《적절히 달리기 위한 힘, 냉정함》

    ... 더 보기

    독일 딜리버리히어로(DH)의 올해 1분기 실적발표 컨퍼런스콜에서 마리 앤 최고재무책임자(CFO)는 전세계 자사 브랜드 12곳 중 배민의 부진을 콕 찍어 투자자들에 고개를 숙였다. 올해 1분기 아시아 지역 GMV(거래액)이 전년 대비 12% 이상 감소했다는 '어닝 쇼크'를 언급하면서다. 특히 한국을 제외한 전세계 GMV가 22% 급성장한 점과도 대비됐다.

    ... 더 보기

    성장세 꺾인 배민…IB업계선 '매각 가능성' 설왕설래

    n.news.naver.com

    성장세 꺾인 배민…IB업계선 '매각 가능성' 설왕설래

    괴물은 하루아침에 태어나지 않는다

    큰 것을 하는 것보다 매일 작은 것을 완벽하게 해내는 노력이 더 중요하다. 내가 성격 장애의 하나인 자기애성 성격장애자(NPD, Narcissistic Personality Disorder)를 만나면서 느낀 것은, 처음에는 그런 사람도 "정상인"처럼 느껴진다는 것이었다. 다만 그의 미친짓은 내가 매일매일 "사소한" 사건들로 상대방에게 익숙해졌을 때 발생한다.

    ... 더 보기