본문 바로가기
Study/CS

[문자열] 문자(아스키코드-asciicode, 유니코드-unicode)와 인코딩(utf-8, base64)

by _royJang 2022. 5. 25.

시작

컴퓨터 세계에서 문자라고 한다면 대부분의 사람들이 들어봤을 아스키코드와 유니코드가 대표적일 것이다. 어떠한 기회가 있어서 이 부분에 대해 관심이 생겼고(원래도 알았어야 한다고 생각하지만 그렇지 못했다!) 공부해 보았다. 깊이 있게 알게 됐다고는 말할 수 있을지 모르겠지만 이전보다는 더 많은 것을 알게 됐다. 그 부분을 기억하기 위해 이렇게 기록하고자 한다.

아스키코드

아스키코드는 컴퓨터를 만들었고 가장 초창기에 컴퓨터에 대해 깊게 사용하기 시작한 서양권(영문권)의 나라들이 정립한 것이다. 그때문에 코딩에 필요한 몇몇 특수 문자들과 영문, 숫자 정도를 포함하고 있다. 그렇기에 7bit라는 작은 범위에 코딩에 필요한 문자를 맵핑한 약속이다.

유니코드

하지만 컴퓨터는 영문권에서만 사용되는 것이 아니게 됐다. 그래서 각 나라들은 그들만의 문자 체계를 만들게 됐고 이것은 인터넷이 활성화 되면서 서로 다른 약속을 사용하는 나라 간에 문자를 제대로 확인할 수 없는 문제를 가지고 왔다.

이 문제를 해결하기 위해서 모든 나라가 통합된 문자에 대한 약속을 사용할 필요가 생겼고, 이 문제를 해결하기 위한 새로운 약속이 유니코드이다.

유니코드는 16bit 즉 2^16 개의 숫자에 세계의 거의 모든 문자를 맵핑한 문자 체계이다.

참고로 한글의 유니코드는 0xAC00(가) 부터 0xD7A3(힣) 까지 11,172개의 숫자를 차지하고 있다.

인코딩

이렇게 약속된 문자들은 결국 인터넷에서 깨짐없이 깔끔한 웹페이지(HTML파일)를 보여주기 위함이라고 할 수 있을 텐데 이러한 값들을 정확히 보여주기 위해선 인코딩이라는 과정을 거쳐야 한다. 인코딩 과정이 어떻게 이뤄지는지 간단히 살펴보겠다. 굉장히 단순한 방법이기에 이해가 어렵진 않다.

UTF-8

아스키코드와 유니코드를 묶어서 한곳에 표현하는 것이 UTF-8인코딩 방식이다. 주어진 값을 보았을 때 아스키코드의 범위에 있다면 그 값을 1byte의 아스키코드로 표현하고, 그 외엔 2byte의 유니코드를 3byte로 표현하는 방식이다.

base64

Base64 테이블
ASCII 테이블

본인 이름의 이니셜을 통해 base64 인코딩을 살펴보겠다.

먼저 대문자 영문, ASCII 16진수, 그 값의 2진수를 나타내겠다.

영문 이니셜 J S H
16진수 ASCII 0x4A 0x53 0x48
2진수 ASCII 0010 0111 0101 0011 0100 1000

이제 이 2진수를 6bit씩 끊어낸 후 base64 테이블을 참조해 그 값을 매칭 하면 된다.

001001 110101 001101 001000
J 1 N I

JSH의 Base64 인코딩 결과는 J1NI이다.

웹 검색을 해 보면 Base64가 압축방법, 암호화 방법이라고 설명하는 글들이 있다. 하지만 보이는 것과 같이 결괏값은 3개의 문자에서 4개의 문자로 늘어난다. 이는 압축이 아니며, 이렇게 규칙화된 방법을 통해 인코딩을 하는데 암호화라고도 볼 수 없다.

한글의 인코딩

초기엔 EUC-KR 이라는 완성형 인코딩을 사용했다. 하지만 사용 빈도가 잦은 2500개의 문자만을 포함하고 있으며 이로 인해 한글 표기에 적지 않은 오류가 있었다.
ex) 예전 네이트 운세에서 쌰가 없어서 으쌰으쌰가 으?으?! 로 표기됐다고 한다... 비교적 최근엔 긴급재난문자와 안전 안내 문자에도 같은 문제가 있다. 경상남도 창원시에서 코로나 확진자가 방문한 돈까스 프랜차이즈 매장 이름에 들어가는 쑝이라는 글자를 쓰지 못해 쑈+ㅇ 으로 고쳐 안내하는 일이 있었다..ㅋ

~ 초창기 약속을 정할 때 가, 각, 갂 과 같이 완성형으로 사용할지, ㄱㅏ, ㄱㅏㄱ 과 같이 조합형으로 사용할지에 대해 싸움이 났다고 한다^^.. ~

이를 MS에서 조금 더 확장시켜서 CP-949를 사용했다.

 

 

// 유니코드 문자 확인
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EC%98%81%EC%97%AD

참고

https://www.youtube.com/watch?v=A8tO4D1Gtc0&t=1s
널널한 개발자님의 유튜브를 참고하였습니다.
양질의 자료가 너무너무 많습니다. 아주 유익한 채널이라 생각이 들어 이렇게 공유해 봅니다!