【문자셋】과 【인코딩】이 다른 의미였다고?

문자셋과 인코딩 차이점

[ 컴퓨터 상식 목차 ]

문자셋(Charset)인코딩(Encoding)은 혼용되서 사용되어지기도 하고, 어떤 측면에서는 둘의 의미가 비슷하기도 합니다.

둘의 차이점을 아스키(ASCII) 코드로 설명을 해보겠습니다. 아래 아스키 표에서 볼 수 있듯이, 아스키 코드는 0번에서 127번까지 숫자, 영어, 그리고 특수문자의 “문자의 집합”을 가집니다. 숫자와 순서와는 상관없이 문자 그 자체의 조합(문자 집합) 문자세트 또는 문자셋이라고 부릅니다. 따라서 아스키(ASCII)문자셋입니다. 사실 이렇게 설명하려니 조금 민망하긴 합니다. 문자집합이라는 말은 문자셋(Character Set)를 번역한 것에 지나지 않기 때문입니다. 하지만, 어렵게 생각하는 것보다 이렇게 이해하는 것이 가장 직관적인거 같습니다.

(그림 출처)

이번에는 위 아스키 표에서 Decimal(10진수)와 Char(문자)에 주목해 보겠습니다. 각 문자들은 해당 숫자에 맵핑되어 있습니다. 이렇게 문자와 숫자의 짝을 지어주는 것이 인코딩입니다. 인코딩을 굳이 번역하자면 암호화, 또는 부호화 정도로 할 수 있습니다. 인코딩을 하는 이유는 문자를 컴퓨터에 저장하기 위해서 숫자로 바꿔주는 작업이 필요하기 때문입니다. 이렇게 변환된 숫자를 컴퓨터는 2진수 형태로 저장하게 됩니다. 저장하는 방식에 대해서 궁금하신 분은 Ref 1을 참조하시면 될 것 같습니다.

정리하자면 문자셋(Character Set)은 문자집합, 인코딩(Encoding)은 2진법 맵핑으로 이해할 수 있습니다. 여기서 왜 사람들이 이 둘을 혼용해서 사용하는지를 생각해보면, “문자셋으로 아스키를 설정”한다는 의미나 “아스키 방식으로 인코딩”한다는 의미가 궁극적으론 비슷한 말이기 때문입니다.

하지만 굳이 둘의 차이점을 찾아보겠습니다. 위의 정의대로 생각해본다면, 같은 문자셋일지라도 인코딩 방식을 다르게 적용할 수 있을 것입니다. 예를 들자면 A를 65번에 맵핑하지 않고, 100번에 맵핑할 수도 있을 거에요. 실제로 이런 비슷한 예가 있는데, 바로 유니코드에서 찾을 수 있습니다. 아스키는 컴퓨터 개발 초기단계에 만들어진 영어 중심의 문자셋이였기 때문에, 한글을 포함한 세계 각국의 글자를 표시할 수 없었습니다. 따라서 전세계 모든 문자를 담기 위한 새로운 문자셋을 만들었는데 이것이 바로 유니코드였습니다(유니코드 = 문자셋). 하지만 이런 유니코드도 UTF-8, UTF-16 등과 같이 여러 인코딩 방식이 있습니다 (UTF-8, UTF-16 = 인코딩 방식). UTF-8 인코딩의 경우에는 1 글자를 1바이트(영어의 경우)에서 많게는 4바이트까지 저장합니다. 반면 UTF-16 인코딩 방식은 특수한 글자를 제외한 대부분 글자를 공정하게 2바이트로 저장합니다. 즉, UTF-8과 UTF-16은 같은 문자셋에 다른 번호를 부여한다고 이해하실 수 있습니다.

하지만 문자셋과 인코딩을 너무 분리해서는 생각할 필요는 없을 것 같습니다. MySQL 같은데서 데이터베이스 생성할 때 보면, CHARACTER SET에 “문자셋(예: ASCII 또는 UNICODE)”을 적지 않고 “인코딩(예: utf-8)”을 적습니다. 하지만 이번 포스트를 제대로 이해하셨다면, “CHARACTER SET”이란 이름이 잘못된 것을 알 수 있습니다. 엄밀히 말하면 “ENCODING”과 같은 이름을 사용해야하는데 말이죠. 😊

<참조 인용>

Ref 1. UTF-8의 유니코드 개념

[ 컴퓨터 상식 목차 ]


1 thought on “【문자셋】과 【인코딩】이 다른 의미였다고?”

  1. Pingback: 파이썬 기초 – 유니코드 인코딩 - Go! J-studio

Leave a Reply