본문 바로가기
IT이야기

아스키코드, 유니코드, UTF-8, UTF-16 세트메뉴로 한방에 이해하기

by Kim_Jack 2024. 2. 10.
반응형

아스키코드(ASCII), 유니코드(Unicode), UTF-8, UTF-16 한방에 이해하기

https://www.youtube.com/watch?v=KMgr77qqLdo&t=97s

 

 

문자 처리의 기본인아스키코드, 유니코드 UTF-8, UTF-16등에 대해서 이해하기 쉽도록 정리한 글입니다.

 

인코딩, 디코딩이란?

이 모든 것들을 이해하기 위해 가장 먼저 인코딩, 디코딩의 개념을 정확하게 이해하여야 합니다.

인코딩은 사람의 언어에서 컴퓨터가 읽기 편한 컴퓨터의 언어로 만드는 과정으로 이해하시면 됩니다.

인간 언어 → 컴퓨터 언어

비슷한 예시를 들자면,

음악을 만들 때, 음악의 멜로디와 박자를 악보로 만듭니다. 작곡가는 노래를 만들 때 음표들을 악보에 인코딩합니다.

악보는 인코딩 된 데이터입니다. 그리고 가수는 악보를 디코딩하여 악보를 보고 노래를 부릅니다.

이렇게 음악에서의 악보 인코딩과 디코딩은 컴퓨터에서의 문자 인코딩과 디코딩과 비슷합니다.

 

아스키코드, 유니코드?

악보에서는 오선지와 여러 음표, 쉼표등으로 이루어졌습니다. 이는 음악을 악보에 표시하는 방식을 ‘약속’ 한 것입니다.

아스키코드와 유니코드도 똑같습니다. 인간의 문자를 컴퓨터에 저장하기 위한 방식을 약속한 것입니다.

 

사람들은 소통을 위해서 문자언어를 사용합니다 (A,B,C.. 가,나,다.. 등등)

이는 인간끼리의 소통을 위한 문자이며 컴퓨터는 이를 바로 이해할 수 없습니다.

인간의 문자를 컴퓨터가 이해할 수 있게 ‘인코딩’을 해줘야 합니다.

문자를 인코딩하는 방식은 여러 가지가 있으나

그중 전 세계적으로 보편적으로 쓰이고 가장 기본인 아스키코드(ASCII)에 대해서 먼저 얘기해 보겠습니다.

 

아스키코드(ASCII)

아스키코드는 컴퓨터가 문자를 이해하고 표현하기 위해 사용하는 문자 표준입니다.

쉽게 얘기하면 각 문자들과 그 문자가 가지는 숫자값이 1:1 매핑되어 있는 테이블표가 아스키코드입니다.

각각의 문자는 숫자로 표현됩니다.

대문자 'A'는 숫자 65로 표현되고, 소문자 'a'는 숫자 97로 표현됩니다.

아스키코드 인코딩 플로우

문자 A는 아스키코드에 따라서 65로 매핑됩니다. 그 후 65는 2진수로 바뀌어 최종적으로 컴퓨터에서 처리됩니다.

문자(A) → 65(ASCII) → 2진수 (01000001)

아스키코드는 1960년대에 나온 표준이기에 영어, 숫자와 기본적인 특수문자(!, ? ,%…등등)들만 지원합니다.

영어 외에 언어는 지원하지 않습니다.

아스키코드의 개수는 총 127개이며

그렇기에 모든 아스키코드값은 1byte(8bit)로 처리됩니다. (정확히는 7bit + 1bit패리티 비트)

 

유니코드(Unicode), UTF-8

아스키코드는 128개의 문자만(알파벳, 기본 특수문자등)을 지원하지만

유니코드는 전 세계의 모든 문자를 지원하기 위해 설계되었습니다.

 

아스키코드가 문자-숫자 형태로 1:1 매핑되어 있듯, 유니코드도 마찬가지입니다.

모든 문자마다 각각의 유니코드 코드포인트로 1:1 매핑됩니다. ex) A(문자) ↔ U+0041(코드포인트)

 

유니코드의 코드포인트는 문자를 구분하기 위해서 문자들에게 각각의 고유한 ID를 부여한 것이고, 이는 컴퓨터에서 바로 처리할 수 없습니다.

그래서 이 코드포인트를 인코딩해주는 방식이 바로 UTF-8입니다

UTF-8은 유니코드 코드포인트를 인풋으로 받고 일반적으로 16진수 값을 아웃풋으로 뱉습니다.

A(U+0041)를 UTF-8로 인코딩하면 0x41이 됩니다.

 

가변길이 인코딩

유니코드는 가변길이 인코딩을 사용합니다.

가변길이 인코딩이 뭘까요?

아스키코드는 0~127 범위를 가지기에 1바이트 이상이 필요하지 않습니다.

하지만 유니코드는 백만 개 이상의 문자를 표현해야 하기에 4바이트까지 사용이 됩니다.

모든 문자가 4바이트로 인코딩 되는 게 아니고, 문자마다 다릅니다. 이렇기에 가변길이 인코딩이라 합니다.

유니코드는 아스키코드와 호환이 가능합니다 고로 영어는 1바이트로 인코딩 됩니다.

라틴어는 2바이트

한글은 3바이트

이모티콘은 4바이트

이외에도 각 바이트 영역에는 더 다양한 문자들이 존재합니다.

가변길이 인코딩을 사용하는 이유는 문자들 인코딩에서 메모리들을 좀 더 효율적으로 쓰기 위함입니다.

그리고 유니코드는 메모리 영역별로 앞으로 추가될 수 있는 문자, 특수문자, 이모티콘등을 고려하여 충분한 여유를 가지고 설계되었습니다.

 

 

UTF-16

UTF-16은 유니코드 문자를 표현하는 또 다른 방식입니다.

가변길이 인코딩을 사용하지 않으며, 모든 문자를 2바이트로 인코딩합니다.

1바이트로 표현이 가능한 아스키코드(영어등)들도 2바이트로 인코딩합니다.

그리고 3바이트로 표현하던 한글 또한 2바이트로 인코딩을 합니다. 이는 메모리를 좀 더 아낄 수 있는 이점이 있습니다.

 

그것보다도 UTF-16을 쓰는 더 큰 이유는 문자들이 전부 균일한 2바이트 메모리를 가진다는 점입니다.

이는 개발 시에 문자별로 메모리 처리를 다르게 하지 않아도 되기에 매우 효율적이고 문자열 처리를 쉽게 만들어줍니다.

이러한 이유로 실제 JAVA나 .NET에서는 UTF-16으로 설계가 되어있습니다.

반응형

댓글