인코딩과 코드표
인코딩
사용자가 입력한 문자, 숫자, 특문 등의 데이터를 컴퓨터에 저장할 수 있는 이해하는 이진 데이터로 변환하는 것
문자, 숫자, 특문 등은 사람이 이해할 수 있지만, 이진 체계 저장소에 이를 저장하기 위해서는 0,1의 이진 데이터로 변환해야 한다.
현재 이 글도 문자로 출력되고 있지만, 저장소에 저장된 데이터 자체는 결국 0,1의 이진 데이터이며, 이를 OS가 읽어 문자로 출력한다.
반대로 이진 데이터를 사람이 읽을 수 있는 데이터로 변환하는 것을 디코딩이라고 한다.
코드표
문자 데이터를 이진 데이터로 변환하기 위해서는 서로 합의된 약속이 필요하다. 여기서 사용하는 것이 코드표이다.
- 컴퓨터에서 문자를 표현하기 위해 문자 - 코드가 1:1로 매핑된 표
코드표에는 우리가 사용하는 문자와 그에 해당하는 코드(숫자)가 매핑된 정보가 저장되어있다.
문자를 4 비트로 저장하는 예시
문자 | 10진 | 2진 |
a | 10 | 1010 |
- 문자 a가 10이라는 10진수에 매핑되어 있다면 이는 2진수로 1010이고 컴퓨터에 1010이 저장된다.
- 문자를 출력할 때는 1010이 a에 매핑되어 있으므로 이를 a로 변환하여 출력한다.
이처럼 코드표는 문자 - 이진 데이터간 변환을 위해 사용하는 약속이며, 여러가지 코드표가 존재한다.
ASCII
- 1byte 체계. 문자 하나를 저장하는데 1byte를 사용한다.
- 10진수 0 ~ 127에 128개의 문자(영 대/소문자, 숫자, 일부 특문)가 매핑됨
- 1byte(8bit) 중 맨 앞자리 1bit는 에러 검출에 사용
Unicode
영미권이 아닌 다른 국가에서 컴퓨터를 사용하면서 각 국가의 문자를 저장하기 위한 여러 코드표가 사용되었다.
그러나 네트워크가 발전하면서 각기 다른 국가의 데이터를 출력하는 과정에서 코드표 통일되지 않아 문자가 깨지는 현상이 발생했다. 우리나라에서는 0000 0001을 'ㄱ'으로 저장/출력하지만 다른 코드표를 사용하는 국가에서는 0000 0001을 'a'나 다른 문자로 출력하는 상황이 발생
이러한 상황을 해결하기 위해 국제적으로 모든 문자를 출력할 수 있는 공통된 표준 코드표가 만들어 졌으며 이를 유니코드라 한다.
UTF-8(Unicode Transformation Format-8bit)
위에서 인코딩은 문자 데이터를 컴퓨터가 이해하는 이진 데이터로 변환하는 것이고, 코드표는 그 변환을 위한 약속된 매핑표라 했다. UTF-8은 유니코드라는 매핑표를 참조하여 문자를 이진 데이터로 변환하는 인코딩 방식의 하나이다.
- UTF-8: 유니코드 기반의 인코딩 방식
유니코드만으로는 문자를 이진 데이터로 변환할 수 없다. 코드표는 말 그대로 문자를 코드로 변환하기 위한 참조용일 뿐이며, 인코딩 과정에서 이를 사용한다
인코딩 방식
UTF-8은 가변 길이 인코딩 방식이다. 문자 데이터를 저장하기 위해 사용하는 데이터 크기가 문자 마다 다르다.
- 최대 저장 가능한 데이터 크기는 6byte
- 다른 인코딩과의 호환을 위해 4byte 까지만 사용
- 문자와 매핑되 코드표에 따라 1 ~ 4byte를 할당하여 데이터를 저장
- 1btye인 경우(ASCII 코드)
- 첫 bit에 0을 할당하고 나머지에 ASCII 코드에 따라 데이터 저장
- 2byte 이상인 경우
- 첫 byte에 얼마 만큼의 byte를 사용할지 지정
- 나머지 byte에 연결된 byte임을 표시하기 위해 첫 bit 자리에 ㅇㄹ
- 2byte: 110, 3byte: 1110, 4byte: 11110
- 1btye인 경우(ASCII 코드)
예시
문자 | 16진수 | 10진수 | 2진수 | UTF-8 변환 |
a | 0x0061 | 91 | 1100001 | 01100001 |
가 | 0xAC00 | 767 | 1010110000000000 | 11101010 10110000 10000000 |
- 문자 'a'는 유니코드표 상에서 0x0061(16진수), 91(10진수), 1100001(2진수) 라는 코드로 변환된다. 이는 ASCII 코드표를 참조해도 동일하다.
- 저장소에 저장하기 위한 형태인 2진수를 UTF-8을 통해 인코딩하면 1byte만 사용하기 때문에 그대로 01100001를 저장하게 된다.
- 문자 '가'는 유니코드표 상에서 0xAC00(16진수), 767(10진수), 1010110000000000(2진수) 라는 코드로 변환된다
- 2진수를 UTF-8을 통해 인코딩하면 3byte를 사용하기 때문에 첫 byte에 1110 이 첫 bit 자리에 추가되고, 나머지 byte에 10이 첫 bit 자리에 추가된다. 나머지 bit 자리에는 2진수 데이터가 저장된다.