유니코드가 탄생하기 이전에는, 같은 한글이 적힌 텍스트 파일이라도 표현하는 방법이 제각각이었다. 어떤 파일이 지원하지 않는 다른 인코딩 형식으로 저장되어 있는 경우에는 파일을 제대로 불러올 수 없었다. 기본적으로 유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
인코딩(부호화)이란?
- 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것.
- 이 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해서는 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 한다.
- 인코딩과 디코딩의 기준을 문자열 세트 또는 문자셋(charset)이라고 한다.
- 이 문자셋의 국제 표준이 유니코드.
원리
ex 1) '코'라는 문자를 UFT-8로 표현
코
라는 문자의 유니코드는 U+CF54 (16진수, HEX)로 표현된다.- 이 문자를 이진법(binary number)으로 표시하면, 1100-1111-0101-0100 이 된다.
- 이 문자를 UTF-8로 표현하면, 다음과 같이 3byte의 결과로 표현된다.
1110xxxx 10xxxxxx 10xxxxxx # x 안에 순서대로 값을 채워넣습니다. 11101100 10111101 10010100
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8' encoder.encode('코') // Uint8Array(3) [236, 189, 148] (236).toString(2) // "11101100" (189).toString(2) // "10111101" (148).toString(2) // "10010100"
ex 2) 'b'라는 문자를 UFT-8로 표현
- ASCII 코드는 7비트로 표현되고, UTF-8에서는 다음과 같이 1 byte의 결과로 만들 수 있다.
0xxxxxxx 01100010
encoder.encode('b') // Uint8Array [98] (98).toString(2) // "1100010"
- U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 이다.
- 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라진다.