문자 집합과 인코딩
문자 집합 : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
문자 인코딩 : 문자를 0과 1로 변환해 컴퓨터가 이해할 수 있게 바꾸는 것
문자 디코딩 : 문자 인코딩의 반대 과정으로, 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정
아스키 코드
아스키(ASSCII : American Standard Code for Information Interchange )
- 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 일부 특수문자를 포함한다.
- 아스키 문자는 각각 7비트로 표현되고, 2^7로 총 128개의 문자를 표현할 수 있다.
* 패리티 비트( parity bit ) : 오류 검출 비트, 일부 초기 컴퓨터 시스템에서는 ASCII를 8비트로 확장하면서 오류 검출을 위해 패리티 비트를 추가하기도 했다.
아스키 코드 : 아스키 문자에 대응된 고유한 수 ( 예시 : 삭제/DEL의 아스키 코드는 127 )
* 코드 포인트( code point ) : 문자 인코딩에서 '글자에 부여한 고유한 값' 예를 들어 아스키 코드에서 A의 코드 포인트는 65
아스키 코드는 매우 간단하게 인코딩된다는 장점이 있지만 128가지의 문자만 표현할 수 있기에 한글, 특수문자, 다른 언어들을 표현할 수 없다는 단점이 있다. 더 다양한 문자 표현을 위해 아스키 코드에 1비트를 추가한 8비트의 확장 아스키가 등장하기도 했지만 그럼에도 표현 가능한 문자의 수가 256개라 부족했다.
그래서 영어를 제외한 다른 문자를 사용하는 언어권에서는 자신들의 언어를 0과 1로 표현할 수 있는 고유한 문자 집합과 인코딩 방식을 정의하고 사용했다.
EUC-KR
우리나라는 한글의 특수성 ( 문자 하나가 초성, 중성, 종성으로 위치지어지는 자음과 모음의 집합으로 있다 )으로 인해
두 가지 인코딩 방싱이 존재한다.
- 완성형 인코딩 : 초성, 중성, 종성의 조합으로 된 하나의 글자에 고유한 코드를 부여하는 방식
- 조합형 인코딩 : 초성/중성/종성을 위한 비트열을 할당하고, 조합하여 하나의 코드를 완성하는 방식
EUC - KR은 대표적인 완성형 인코딩 방식이다. 하나의 글자에 2바이트 크기의 코드를 부여한다.
자주 사용되는 한글 음절만을 코드에 할당했기에 2350여개 가량의 한글 음절만 사용 가능하다.
( KS X 1001 표준 자체가 2350개의 한글 음절만을 정의하고 있다. )
그래서 문자 집합에 정의되지 않은 '쀍', '쀓', '믜' 같은 글자는 EUC -KR로 표현할 수 없고 깨지게 된다.
이러한 문제를 해결하기 위해 등장한 것이 CP949로 조금 더 확장된 버전이지만,
이마저도 한글 전체를 표현하기에 넉넉한 양은 아니다.
유니코드와 UTF - 8
나라별로, 혹은 언어별로 다른 인코딩 방식이 있다면 구글 같은 웹사이트에서는 모든 인코딩 방식을 알아야 하는 번거로움이 있다. 이런 수고를 피하기 위해서 등장한 것이 유니코드 문자 집합이다.
유니코드는 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있기 떄문에
현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합이다.
https://www.unicode.org/charts/PDF/UAC00.pdf
* 간혹 유니코드 글자에 부여된 값 앞에 U+라는 문자열을 붙이기도 하는데, 이는 16진수로 유니코드를 사용할 때의 표기
아스키 코드나 EUC - KR은 글자에 부여된 값을 그대로 인코딩 값으로 삼았다.
그러나 유니코드는 부여된 값 자체를 인코딩 값으로 삼지 않고 다양한 방법으로 인코딩한다.
이런 인코딩 방법에는 크게 UTF - 8 , UTF - 16, UTF - 32 등이 있다.
(UTF : Unicode Transformation Format의 약어로 유니 코드를 인코딩하는 방법)
UTF - 8
- 가장 대중적인 방식
- 1바이트부터 4바이트까지의 인코딩 결과를 만들어 낸다. (가변 길이 인코딩 )
- 첫 번째 비트들은 "이 문자가 몇 바이트 짜리인지"를 나타냄, 나머지 비트들은 실제 문자 코드값을 표현
예를 들어 '가'를 UTF - 8로 변환한다고 하면
'가'는 U+AC00(16진수)이고, 이를 10진수로 변환하면
0xAC00 = 1010110000000000 (16비트)
한글은 2048 ~ 65535의 범위 안에 있고 이느 3바이트이므로 UTF - 8의 3바이트 규칙을 적용하면
1110xxxx 10xxxxxx 10xxxxxx
1010110000000000 (원래 유니코드 값)
→ 1110 1010 10100000 10000000
→ 0xEAB080
따라서 최종적으로 '가'는 0xEAB080으로 인코딩 되게 된다.
1️⃣ '가'의 유니코드 코드 포인트: U+AC00 (16진수) → 1010 1100 0000 0000 (2바이트, 16비트)
2️⃣ UTF-8은 3바이트가 필요하므로 변환 형식 적용:
1110xxxx 10xxxxxx 10xxxxxx
3️⃣ 원래 16비트 값을 3바이트에 나눠서 저장:
1010 1100 0000 0000 → UTF-8 규칙에 맞게 변환
첫 바이트(Leading Byte): 1110 1010 (0xEA)
두 번째 바이트: 1010 0000 (0xB0)
세 번째 바이트: 1000 0000 (0x80)
4️⃣ 최종 UTF-8 인코딩 값:
0xEAB080 (1110 1010 1010 0000 1000 0000)
'개념공부 > 컴퓨터구조와 운영체제' 카테고리의 다른 글
03장 - 2 : 명령어의 구조 (0) | 2025.03.28 |
---|---|
03장 - 1 : 소스 코드와 명령어 (0) | 2025.03.26 |
02장 -1 0과 1로 숫자를 표현하는 방법 (0) | 2025.03.24 |
01장 - 2 . 컴퓨터 구조의 큰 그림 (0) | 2025.03.23 |
00. 왜 공부하는가 ? (0) | 2025.03.20 |