-
[TIL]Day 19. 문자 인코딩이란?IT 지식 2020. 9. 29. 11:33728x90
우리가 컴퓨터를 하다 보면 종종 저런 화면을 보게 될 때가 있습니다. 인터넷 서핑 중 저런 화면을 만나게 된다면 내 컴퓨터가 해킹되고 있는 것은 아닌지 걱정이 되기도 하고, 코딩 중 저런 화면을 만나게 된다면 설마 내 프로젝트가 전부 날아가게 되는 것은 아닌지 절망감에 빠지기도 합니다. 하지만 저 화면은 생각보다 무서운 화면은 아닙니다(상황에 따라선...). 저런 화면이 나오게 되는 것은 문자 인코딩이 제대로 되지 않은 경우에 많이 발생하게 됩니다. 오늘의 포스팅은 바로 이 문자 인코딩에 관한 것입니다.
1. 아스키코드와 유니코드
문자 인코딩을 말하기에 앞서 우리가 알아야 하는 것은 아스키코드와 유니코드라는 개념입니다. 컴퓨터활용능력시험(줄여서 컴활)을 공부해보신 분이라면 한번쯤 접해보셨을 만한 단어입니다. 근데 이 개념들이 문자 인코딩과는 무슨 관련이 있을까요??
1) 컴퓨터의 문자 인식
컴퓨터는 우리 모두가 알다시피 0과 1로 모든 데이터를 처리합니다. 컴퓨터가 아무리 똑똑해지고 있다고 하더라도 컴퓨터에겐 0과 1이 모든 언어의 전부입니다. 그렇기 때문에 우리가 컴퓨터와 의사소통을 하기 위해선 우리의 언어를 0과 1로 바꾸는 과정을 거쳐야 합니다. 이를 '문자 인코딩' 또는 '부호화'라고 하며, 반대로 컴퓨터의 언어를 인간의 언어로 변환하는 것을 '문자 디코딩', '복호화'라고 합니다.
2) 아스키코드의 등장
문자를 인코딩해서 인간은 드디어 컴퓨터와 좀 더 다양한 대화를 나눌 수 있게 되었습니다. 상호간에 다룰 수 있는 문자의 폭이 넓어졌으니까요. 하지만, 여기서 새로운 문제가 등장합니다. 바로, 어떤 방식으로 문자를 인코딩 할 것인가의 문제이죠. 사람들마다 문자를 인코딩하는 방식이 다르다면, 컴퓨터를 통해 통신을 할 때 문자인코딩이 되지 않아 매번 문자가 깨지는 현상이 발생하게 될 것입니다. 이를 피하기 위해선 동시에 문자 인코딩 방식을 알려줘야 하는데 그것 역시 매우 번거로운 일입니다. 따라서 이러한 문제를 피하고자 미국에서는 아스키코드라는 것을 정의하게 됩니다.
아스키 코드는 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계입니다. 말이 어렵지만 쉽게 말해서 1바이트(128비트)를 활용해서 총 128개의 부호를 표현할 수 있는 부호체계라는 것입니다. 이 체계 하에서는 영문키보드르 입력할 수 있는 모든 기호들이 할당되어 있어서 (영어권 사람들에게) 매우 단순하고 간단하기에 어느 시스템에서도 적용가능하다는 장점이 있습니다.
하지만 점점 컴퓨터를 사용하는 국가들이 늘어감에 따라 1바이트의 영어로만 문자를 표현할 수 없는 상황이 발생하게 됩니다(우리나라에서선 한글로 컴퓨터를 하고 싶다구요!). 역시나 개발자들은 문제가 발생하면 새로운 해결책을 내놓는 사람들이기에 새로운 방식을 도입하게 되는데 이것이 바로 유니코드입니다.
3) 유니코드
우리 한글을 예시로 생각해보면 한글의 조합은 영어의 조합과는 비교도 안되게 많습니다. 또 중국어의 갯수도 만만치 않죠. 이런 다양한 언어들을 표현하기 위해 등장한 유니코드는 2바이트로 모든 문자를 표현합니다. 아스키코드에 비해서 1바이트가 늘어난거죠. 이 1바이트의 차이가 얼마 되지 않는다고도 생각하실 수 있는데요, 이 1바이트의 차이로 인해 전의 2의 8제곱에서 2의 16제곱으로 2의 8제곱이나 더 커진 표현 방식이 되었다고 생각하시면 됩니다. 엄청나게 늘어난 표현방식에도 불구하고 세상의 다양한 언어를 담기에는 부족해서 유니코드는 점차 확장되었고, 2020년 현재 가장 최신 버전은 2020년 3월에 배포된 유니코드 13.0이 가장 최신 버전입니다(그만큼 표현할 수 있는 언어의 수가 엄청나게 늘어났습니다).
2. 문자 인코딩의 방식
드디어 길고 길었던 문자 부호 체계 내용을 지나, 그 문자 부호를 어떤 방식으로 코딩할 것인가에 대한 이야기를 나누어보도록 하겠습니다. 보통 인간이 언어를 표기할 때에는 기본적으로 주어진 문자들을 조합해서 언어를 표현합니다. 그래서 컴퓨터도 다양한 문자들을 가지고 있어야 이를 조합할 수 있습니다. 이런 문자들을 조합하는 방식에는 여러가지가 있으나, 우리나라에서 자주 접할 수 있는 문자 인코딩의 방식이 UTF-8과 EUC-KR, 이 두 사례를 바탕으로 설명드리도록 하겠습니다.
1) UTF-8
이 방식은 전세계에서 개발자들이 가장 많이 사용하는 인코딩 방식입니다. 일반적으로 운영되는 서버들의 운영체제는 리눅스 계열 입니다. 이러한 리눅스 계열의 대부분은 유니코드를 지원하기 때문에 UTF-8 방식을 활용한다면 따로 인코딩 과정을 거치지 않아도 되게끔 인터넷 환경이 주어져 있습니다. UTF-8 방식은 조합형 인코딩 방식으로 주어진 문자들을 하나하나 조합해서 문자를 완성하는 방식입니다.
EX) 'ㄱ' + 'ㅐ' + 'ㅂ' + 'ㅏ' + 'ㄹ' + 'ㅎ' + 'ㅏ' + 'ㅈ' + 'ㅏ' => 개발하자
2) EUC-KR
이 방식은 글자 하나하나가 완성되어야 하는 방식입니다. 이를 완성형 방식이라고 하는데, 컴퓨터에게 주어진 문자표에서 완성된 글자 하나하나를 찾아서 완성해나가는 방식이라고 생각하시면 됩니다. 얼핏 생각해보면 이 방식은 활용도 면에서 굉장히 안좋은 방식이라고 생각할 수 있습니다. 문자표에 우리가 표현하고자 하는 언어가 없다면 표현할 수 없기 때문입니다. 그런데 왜 이 방식을 사용하는 걸까요?
EX) '개' + '발' + '하' + '자' => 개발하자
그 이유는 윈도우의 문자 인코딩 방식이 완성형이기 때문입니다. 사용하는 운영체제의 방식이 완성형이다보니, 여기에 맞는 문자인코딩 방식이 필요했고 그 결과가 EUC-KR의 개발로 이어진 것입니다.
3. 그래서 문자가 깨지는 현상이 발생한다면?
그래서 여러분이 컴퓨터를 사용하는 과정에서 문자가 깨지는 현상이 발생한다면, 여러분과 서버, 혹은 컴퓨터 사이에 문자인코딩의 방식이 맞지 않아서 그런 것이라고 생각하시면 됩니다. 서로간에 말을 통역해줄 수 있는 사람이 말을 제대로 전달해주지 못하고 있는 것이지요. 그렇기 때문에 이런 현상이 발생했을 때에는 당황하지 말고 문자인코딩의 방식을 바꾸어보시면 해결이 되실 겁니다. 이를 바꾸는 방식은 상황마다 다르고, 방법도 다양하기 때문에 이번 포스팅에서는 다루지 않도록 하겠습니다.
4. 마치며.
이번 포스팅은 제가 VS Code로 C 언어를 배워보려다 발생했던 문자 인코딩 문제에 대해 다뤄봤습니다. 당연히 될 줄 알았던 한글을 제대로 표현하지 못하니 당황스럽고 답답한 마음에 여러 정보를 찾아보았고 해결할 수 있어서 너무 좋았었는데요. 여러분도 혹여나 이런 문제에 부딪히신다면 헤메지 마시고 바로 문자 인코딩이라는 단어를 떠올리시면 좋을 것 같습니다!!
728x90'IT 지식' 카테고리의 다른 글
[TIL]Day 21. for/in 을 사용하면 안되는 이유!!!(in JS) (0) 2020.10.05 [TIL]Day 20. 리액트(React)란? (0) 2020.10.04 [TIL]Day 18. 라이브러리? 프레임 워크? (0) 2020.09.28 [TIL]Day 17. addEventListener 에 대해 (0) 2020.09.23 [TIL]Day 16. HTTP와 DOM의 개념 (0) 2020.09.22