Encoding 이란?

박주진·2021년 8월 8일
0

맡고 있는 업무 특성상 종종 문자열이 깨지는 이슈를 격는다. 그럴 때마다 단순히 아! 이거 문자열 인코딩이 이슈네 하고 넘어갔었다. 그러던 중 갑자기 문자열 인코딩이 정확이 멀까?에 대해 의문이 들었고 그래서 다시 한번 정리해 본다.

문자 집합이란(Character Set)?

문자와 숫자가 매핑된 표. euc-kr은 통합형 한글 코드(Unified Hangul Code)라는 문자집합을 기준으로 하고 utf-8/utf-16/utf-32는 unicode를 기준으로 한다. 즉 문자를 숫자로 나타내는 rule 이다.

문자열 인코딩 이란(Character Encoding)?

컴퓨터는 당연히 우리가 사용하는 문자를 이해할 수 없기때문에 사람이 사용하는 모든 문자를 바이트 코드로 표현 해야 한다. 이 변환하는 과정을 문자열 인코딩이라고 부른다. 즉 문자에 해당하는 숫자를 binary data로 나타내는 rule 이다. 구체적으로는 몇 bit로 숫자를 나타낼 것인가 정하는 것이다.
문자열 인코딩에는 euc-kr,utf-8,utf-16,cp949등이 있다.
참고로 cp949는euc-kr의 문자집합를 모두 포함해서 확장한 문자집합이다.

문자가 바이트로 최종 변화되는 과정

euc-kr과 utf-8을 기준으로 설명하겠다.

  • euc-kr
    통합형 한글 코드 문자집합에서 원하는 문자의 미리 정해진 숫자를 찾는다 그다음 이진수 값으로 변환한다.
    예) '가'-> (10진수 45217/16진수 B0A1) -> 10110000 10100001

  • utf-8
    utf-8도 동일하게 유니코드라는 문자집합에서 원하는 문자의 정해진 숫자를 찾는다. 그리고 똑같이 해당 숫자를 이진수 값으로 변환한다. 그리고 utf-8은 euc-kr과 다르게 이진수 값을 한번 더 utf-8방식으로 인코딩한다.
    예) '가'-> (10진수 44032/16진수 AC00)-> 10101100 00000000 -> 11101010 10110000 10000000
    (자세한 utf-8변환 방식은 생략한다.)

왜 utf-8은 유니코드에 매핑된 이진수의 값을 바로 사용하지 않고 한번 더 인코딩 하는가?

확실하지는 않지만 여기저기 찾아본 결과 아래와 같은 이유라고 한다.

  • 유니코드에 있는 이진수 값은 이해하기 어렵다.
    10101100 00000000
    위와 같은 uicode의 이진수 값이 있다고 하면 컴퓨터는 어디까지가 한개의 문자인지 인식하기 어렵다. 10101100가 한 개 문자인지, 10101100 00000000가 한 개의 문자인지 파악하기 어려울 것이다. 그래서 utf-8/16이라는 인코딩 방식을 이용해 정해진 구격(알고리즘에)맞춰 이진 데이터로 다시 변경한다. utf-8의 경우 첫 번째 바이트를 통해 한 문자열의 크기를 알아낼 수 있다.
    예를 들면 첫 바이트의 맨 앞 비트가 0이면 1바이트로 구성된 문자이다. 이런 형식이 있기 때문에 컴퓨터도 올바르게 바이너리 데이터를 문자로 인식할 수 있게 된다.

그렇다면 개인적인 궁금증은 euc-kr 또한 1-2byte로 가변 크기인데 왜 별도의 인코딩을 한 번 더 진행하지 않는 것일까?

  • 사이즈
    유니코드의 이진수 값을 그대로 사용하면 모든 문자가 32bit 즉 4byte로 표현되어야 한다. 하지만 utf-8방식은 유니코드 범위에 따라 1~4byte 로 인코딩하는 가변 크기 방식을 취하고 있기 때문에 사이즈 측면에서 더욱 효율적이다.

reference

https://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf-8
https://ko.wikipedia.org/wiki/UTF-8
https://stackoverflow.com/questions/47826439/why-cant-we-store-unicode-directly
https://deliciousbrains.com/how-unicode-works/

0개의 댓글