컴퓨터를 다루는 세상에서 수년에 걸쳐 숫자를 알파벳 문자에 대응시키는 표준을 채택했는데, 이것이 바로 ASCII 코드다. 글자를 10진수로 대응하는 표이다.
우리가 사용하는 프로그램, 웹 브라우저, 이메일 같은 것에서 쓰이는 문자들이 ASCII 코드의 표준 방식을 통해 bit 패턴들로 쉽게 변환될 수 있는 것이다.
영문 알파벳을 사용하는 대표적인 문자 인코딩으로 7 비트로 모든 영어 알파벳을 표현할 수 있다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함한다.
유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 다루기 위한 알고리즘 등을 포함하고 있다.
유니코드가 탄생하기 이전에는, 같은 한글이 적힌 텍스트 파일이라도 표현하는 방법이 제각각이었는데, 어떤 파일이 지원하지 않는 다른 인코딩 형식으로 저장되어 있는 경우에는 파일을 제대로 불러올 수 없었다. 기본적으로 유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
UTF-8과 UTF-16은 인코딩 방식의 차이를 의미한다.
UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit의 약자로, UTF- 뒤에 등장하는 숫자는 비트(bit)이다.
UTF-8은 유니코드 한 문자를 나타내기 위해 1 byte(=8 bits)에서 4 bytes까지 사용한다.
원리
예를 들어, 코
라는 문자의 유니코드는 U+CF54 (16진수, HEX)로 표현된다. 이 문자를 이진법(binary number)으로 표시하면, 1100-1111-0101-0100
이 된다. 이 문자를 UTF-8로 표현하면, 다음과 같이 3byte의 결과로 표현된다.
UTF-8로 표현된 '코'
1110xxxx 10xxxxxx 10xxxxxx # x 안에 순서대로 값을 채워넣는다.
11101100 10111101 10010100
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8'
encoder().encode('코') // Uint8Array(3) [236, 189, 148]
(236).toString(2) // "11101110"
(189).toString(2) // "10111101"
(148).toString(2) // "10010100"
ASCII 코드는 7bit로 표현되고, UTF-8에서는 다음과 같이 1byte의 결과로 만들 수 있다. 다음 예제는 b
라는 문자를 UTF-8로 인코딩한 결과다.
UTF-8로 표현된 'b'
0xxxxxxx 01100010
'b'라는 문자를 UTF-8로 표현할 수 있다.
js encoder.encode('b') // Uint8Array [98] (98).toString(2) // "1100010"
이처럼, UTF-8은 1 byte에서 4 bytes까지 가변 길이를 가지는 인코딩 방식이다. 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩 된다. 사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문이다. ASCII 문자는 1 byte 만으로 표현 가능한 것처럼 말이다.
UTF-8은 ASCII 코드의 경우 1 byte, 크게 영어 외 글자는 2byte, 3byte, 보조 글자는 4byte를 차지한다. 이모지는 보조 글자에 해당하기 때문에 4byte가 필요하다.
코드 그대로 바이트 표현 가능
바이트 순서가 다양하다.
UTF-16은 유니코드 코드의 대부분 (U+0000부터 U+FFFF; BMP)을 16 bits로 표현한다.
UTF-16에서 한글은 2 bytes를 차지