문자 집합과 인코딩
- 문자 집합 (Character Set)
- 컴퓨터가 이해할 수 있는 문자의 모음
- 인코딩 (Encoding)
- 코드화하는 과정
- 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정
- 디코딩 (Decoding)
- 코드를 해석하는 과정
- 0과 1로 표현된 문자 코드를 문자로 변환하는 과정
아스키 코드 (ASCII Code)
- 간단한 인코딩
- 초창기 문자 집합 중 하나
- 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
- 총 8bit 할당
- 7bit로 하나의 문자 표현 (27개, 즉 128개 정도의 문자를 아스키 코드로 표현 가능)
- ASCII 표 를 확인해보면 현재 127개의 문자가 아스키 코드로 표현 가능한 것을 확인 가능
- 8bit 중 1bit는 오류 검출을 위해 사용되는 패리티 비트(parity bit)
- 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 표현 불가능
한글 인코딩: 완성형 vs 조합형 인코딩
- 아스키 코드로는 표현 불가능한, 한글을 위한 인코딩이 필요해짐
- 초성, 중성, 종성의 조합으로 이루어진 한글
- 이를 표현하기 위해, 대표적으로 완성형 인코딩 방식과 조합형 인코딩 방식이 존재
완성형 인코딩
- ㄱ과 ㅏ 같은 자음, 모음은 물론이고, "강"과 같은 글자 하나하나에 코드를 부여
조합형 인코딩
- 초성, 중성, 종성의 조합으로 한글이 만들어진다는 것에 중점
- 자음, 모음에 고유한 코드를 부여해 레고처럼 조합하여 사용하는 방식
EUC-KR 인코딩 방식
- KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식
- 완성형 인코딩
- 글자 하나 하나에 2byte 크기의 코드 부여
- 2byte = 16bit = 십육진수 4개로 표현
- 2300여개의 한글 표현 가능
- 완성형 인코딩 방식이기 때문에 쀏, 뙠, 휔처럼 잘 사용하지 않는 글자는 표현 불가능하다는 한계 존재
- 다국어 지원 프로그램을 개발할 때에는 각 언어별로 인코딩 방식을 따로 이해해야한다는 단점
- 그렇다면 모든 언어, 특수문자까지 통일된 문자 집합과 인코딩 방식을 사용하는게 어떨까?
- 유니코드 문자집합과 UTF-8 인코딩이 생기게 된 계기
유니코드 문자 집합과 UTF-8
유니코드
- 통일된 문자 집합
- 한글, 영어, 화살표와 같은 특수 문자, 이모지까지 표현 가능
- 현대 문자 표현에 있어 매우 중요한 위치
- 유니코드의 인코딩 방식
- UTF-8, UTF-16, URF-32
- 유니코드에는 글자마다 유일무이한 코드 값을 가지고 있다
- 이를 "코드 포인트"라고 부른다.
- 이를 그대로 사용하지 않고, 인코딩 방식에 따라 인코딩 하여 0과 1로 변환한다.
- 유니코드 코드 포인트는 "U+XXXX"과 같은 방식으로 표기
- 뒤의 네자리가 실질적으로 사용하는 코드 포인트
UTF-8
- UTF (Unicode Transformation Format) = 유니코드 인코딩 방법
- 가변 길이 인코딩 - 인코딩 결과가 1바이트 ~ 4바이트
- 인코딩 결과가 몇 바이트가 될지는 유니코드의 코드 포인트에 따라 다름
UTF-8 인코딩 방식
UTF-8은 가변 길이 인코딩 방식이다. 인코딩 결과, 1바이트 ~ 4바이트만큼의 공간을 차지하게 된다.
우선 어떤 식으로 변환이 되는지 표를 통해 알아보자.
첫 코드 포인트 | 마지막 코드 포인트 | 1byte | 2byte | 3byte | 4byte |
0000 | 007F | 0XXXXXXX | - | - | - |
0080 | 07FF | 110XXXXX | 10XXXXXX | - | - |
0800 | FFFF | 1110XXXX | 10XXXXXX | 10XXXXXX | - |
10000 | 10FFFF | 11110XXX | 10XXXXXX | 10XXXXXX | 10XXXXXX |
- 유니코드 문자에 부여된 값의 범위가 0부터 007F(16)까지는 1byte로 표현
- 유니코드 문자에 부여된 값의 범위가 0080(16)부터 07FF(16)까지는 2byte로 표현
- 유니코드 문자에 부여된 값의 범위가 0800(16))부터 FFFF(16)까지는 3byte로 표현
- 유니코드 문자에 부여된 값의 범위가 10000(16)부터 10FFFF(16)까지는 4byte로 표현
- X표시가 된 곳에 UTF 코드 포인트를 이진수로 변환한 값을 왼쪽부터 차례대로 채워넣으면 UTF-8로 인코딩된 결과
글로만 보면 잘 이해가 되지 않을 것이다.
그러니, 예시와 함께 직접 인코딩 해보자!
UTF-8 인코딩 방식 예시
"한"이라는 글자를 위의 표를 이용해 UTF-8 방식으로 인코딩 해보자.
1. 먼저, 해당 글자의 유니코드 코드 포인트를 찾는다.
// 참고자료의 "유니코드 검색 사이트" 이용
한 → U+D55C
2. 찾은 코드 포인트를 이진수로 변환한다.
한 → U+D55C → 1101 0101 0101 1100(2)
3. 처음에 찾은 코드 포인트가 표의 어느 범위에 해당하는지 확인한다.
// "한"에 해당하는 코드 포인트, D55C는 0800 ~ FFFF 사이 범위에 해당한다
0800 < D55C < FFFF
4. 범위에 해당하는 인코딩 양식을 표에서 가져온다.
// 0800 ~ FFFF 사이 범위에서의 인코딩 양식
1110XXXX 10XXXXXX 10XXXXXX
5. 인코딩 양식의 X 부분에 2번 에서 변환한 이진수를 차례대로 채워 넣는다.
// 한 → 1101 0101 0101 1100(2)
11101101 10010101 10011100(2)
이 과정 전체를 외울 필요는 없지만, 내부 동작을 이해하면 이후 비슷한 동작을 구현할 때 구조를 참고할 수 있다.
참고자료
- EUC-KR 코드 표: https://uic.io/ko/charset/show/euc-kr/
- 유니코드 검색 사이트: https://symbl.cc/kr
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조 - 2] 컴퓨터가 숫자를 표현하는 방식 (비트, 이진법, 십육진법) (1) | 2024.03.30 |
---|---|
[컴퓨터 구조 - 1] 컴퓨터의 핵심 부품 4가지 + 메인보드 (0) | 2024.03.27 |