UTF-8, UTF-16과 ASCII 코드

이하은·2023년 11월 30일

UNICODE

국가별로 독자적인 문자열 ENCODING을 사용하는 문제를 해결하기 위해 ISO에서 동일한 규칙으로 모든 언어를 표현할 수 있는 유니코드 문자 집합을 만들었다.

UNICODE와 ENCODING은 한마디로 문자를 컴퓨터한테 어떻게 이해시킬지에 대한 부분이다. UNICODE는 표현하고싶은 문자랑 그것이 몇번째 번호인지를 매핑을 한것이라 생각하면 된다.

처음에는 'ASCII CODE'라 해서 1byte로 표현하는 표를 만들었었다(문자를 어떻게 나타낼지에 대한 표).
A는 10진수로 65번이고, 16진수로 0x65로 표현된다. 이런식으로 각각 1바이트 숫자로 대응시켜 컴퓨터한테 이해시키는 것이다.

이렇게 되면 컴퓨터한테 65번 찍어줘! 라고 했을 때 컴퓨터는 65번이 A라는 것을 알고 A를 찍게된다.

그러나 나라마다 언어가 다르니까 어떤식으로든 1byte 안에 자기 나라의 언어를 밀어 넣어서 사용했을 것이고, 인터넷이 발전하면서 다른 나라 언어 사이트에도 접속하는 일이 비일비재해지며 각기 다른 언어때문에 문자가 깨져 읽히는 문제가 발생했다.

그래서 UNICODE라는 것이 탄생했는데, 온세상에 있는 온세상에 있는 문자들을 통일한 규격에 담기 시작했다. 2bytes로 모든 문자를 다 넣어서 표현하게 되었다.

그런데 시간이 흐르면서 희소성이 있는 언어도 추가되어 점점 공간이 부족하기 시작했고, 2bytes로 표현할 수 있는 범위에서 3bytes까지 넘어가게 된다.
예를 들어 'ㅎ' 칠려면 0x001112 이렇게 3바이트를 만들어 컴퓨터한테 넘겨주는 방법이다.

ASCII 코드

ASCII 문자는 영문 알파벳을 사용하는 대표적인 문자 ENCODING으로 7 bit로 모든 영어 알파벳을 표현할 수 있다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함한다.

ASCII는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 ENCODING이 ASCII에 기초를 두고 있다.

컴퓨터는 0과 1로 된 데이터만 저장할 수 있기 때문에, 0과 1을 이용한 텍스트 문자로 나타내야 한다. ASCII는 문자를 컴퓨터가 이해할 수 있는 이진 데이터(0 또는 1)로, 혹은 그 반대로 변환하는 표준 방법이다.

ASCII의 한계
기본 ASCII 코드표는 7 bit만 이용해서 모든 문자들을 나타낸다. 이것은 ASCII 코드로 2^7개, 즉 128개의 문자를 나타낼 수 있다는 것을 의미한다. 확장 ASCII는 8번째 비트를 추가하여 총 256개의 문자를 나타낼 수 있도록 한다.

  • UNICODE는 ASCII를 '확장'한 형태이다.

UNICODE: 훨씬 더 많은 문자들 포함
예를 들어, 유니코드는 100만개 이상의 문자들을 나타낼 수 있는 문자 ENCODING 표준이다. 유니코드의 첫 128개의 문자는 ASCII의 128개의 문자와 동일하므로 서로 호환된다.

utf-8

UTF-8 특징: 가변 길이 인코딩

그 다음으로 ENCODING이라는 것이 나오는데, 이는 어떻게 UNICODE를 컴퓨터한테 이해를 시켜줄지에 대한 것이다.

이제부터는 모든 문자를 3bytes로 표현하는 것이 아니라 가변적인 방법을 사용하기 시작한다.

가장 많이 사용하는 방법중에 UTF-8, UTF-16이 있는데, UTF-8은 즉 일반적인 간단한 영문은 1byte로 표현을 하고 한글과같은 것은 3bytes로 표현을 한다는 것이다. UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit의 약자로, UTF- 뒤에 등장하는 숫자는 비트(bit)다.

따라서 영문이 많이 들어가는 해외에서는 UTF-8이 더 도움이 될 것이다. 그러나 국내사이트 내에서는 한글 한글자에 3byte씩 사용하면 낭비가 된다는 단점이 있다. 그래서 UTF-8은 외부 문자를 우선시한 방법이라고 볼 수 있다.

이는 오늘날 가장 많이 사용하는 문자열 ENCODING이며,
UTF-8은 8비트(1바이트)로 ENCODING한다는 것을 의미한다. ASCII 코드와 호환 가능하며 윈도우, 자바, 임베디드를 제외한 거의 모든 환경에서의 문자열 처리 표준이다.

UTF-8은 UNICODE 한 문자를 나타내기 위해 1 byte(= 8 bit)에서 4 bytes까지의 가변 길이를 가지는 ENCODING 방식이다. 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩된다(사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문).

ASCII 코드는 7bits로 표현되고, UTF-8에서는 1 byte의 결과로 만들 수 있다. 크게 영어 외 글자는 2byte, 3byte, 보조 글자는 4byte를 차지한다. 이모지는 보조 글자에 해당하기 때문에 4byte가 필요하다. 다음 예제는 b 라는 문자를 UTF-8로 인코딩한 결과이다.

let encoder = new TextEncoder();
encoder.encode('b')  // Uint8Array [98]
(98).toString(2)  // "1100010"

'b'라는 문자를 UTF-8로 표현

utf-16

UTF-8과 UTF-16은 ENCODING 방식의 차이를 의미한다.

UTF-16 특징: 코드 그대로 byte로 표현 가능, byte 순서가 다양함
UTF-16은 유니코드 코드 대부분을 16 bits로 표현한다.

대부분에 속하지 않는 기타 문자는 32 bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2 bytes로 표현한다. 2 bytes 또는 4 bytes 길이의 문자열을 사용하며, ASCII 코드와 호환되지 않는다.

U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 이다. 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서에 따라 UTF-16의 종류도 달라진다.

UTF-16은 16 bit(2 bytes)로 ENCODING하는 것을 의미한다. JAVA와 Windows는 유니코드를 사용하기 전부터 고정된 2 bytes 길이의 문자 집합을 사용했다. 그래서 UTF-16은 '멀티 바이트'라고도 한다. 두 환경에서의 호환성 외에 UTF-16을 사용할 이유는 없다.

UTF-16 기반 환경에서 UTF-8을 사용할 때는 사용 영역을 명확히 구분하는게 좋다.

profile
코(딩)린 벨로그

0개의 댓글