1️⃣ 문자 집합과 인코딩
1) 문자 집합(character set)
컴퓨터가 인식하고 표현할 수 있는 문자의 모음.
컴퓨터는 문자 집합에 속해 있는 문자를 이해할 수 있고, 반대로 문자 집합에 속해 있지 않은 문자는 이해할 수 없다. 예를 들어서 문자 집합이 {a, b, c, d, e}인 경우 컴퓨터는 이 다섯 개의 문자를 이해할 수 있고, f나 g 같은 문자는 이해하지 못한다.
2) 문자 인코딩(character encoding)
문자 집합에 속한 문자라고 해서 컴퓨터가 다 이해할 수 있는 것은 아니다. 문자를 0과 1로 변환해야 비로소 컴퓨터가 이해할 수 있다. 이것을 문자 인코딩이라고 하고 인코딩 후에 0과 1로 이루어진 결과값이 문자 코드가 된다. 같은 문자 집합에 대해서도 다양한 인코딩 방법이 있을 수 있다.
3) 문자 디코딩(character decoding)
인코딩의 반대 과정, 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정은 문자 디코딩이라고 한다.
2️⃣ 아스키 코드
ASCII; American Standard Code for Information Interchange는 초창기 문자 집합 중에 하나로, 영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자를 포함한다. 아스키 문자 집합에 속한 문자들은 각각 7비트로 표현되는데, 7비트로 표현할 수 있는 정보의 가짓수는 2의 7제곱로, 총 128개의 문자들을 표현할 수 있다. 000(0x00)부터 127(0x7F)
✅ 실제로는 하나의 아스키 문자를 나타내기 위해 8비트(1바이트)를 사용한다. 하지만 8비트 중 1비트는 패리티 비트(parity bit)라고 불리는, 오류 검출을 위해 사용되는 비트이기 때문에 실질적으로 문자 표현을 위해 사용되는 비트는 7비트이다.
패리티 비트는 7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0으로 하는 식의 패리티 비트를 붙여서, 전송 도중 신호가 변질된 것을 수신측에서 검출해낼 수 있도록 하였다. 일종의 원시적인 CRC 체크섬이라고 할 수 있다.
아스키 코드를 이진수로 표현함으로써 아스키 문자를 0과 1로 표현할 수 있다. 아스키 문자는 아래와 같이 아스키코드로 인코딩된다.
'A'는 십진수 65(이진수 1000001(2))로 인코딩되고, 'a'는 십진수 97(이진수 1100001)로, 특수 문자 !는 십진수 33(이진수 100001)으로 인코딩된다.
✅ 문자 인코딩에서 '글자에 부여된 고유한 값'을 코드 포인트(code point)라고 한다. 아스키 문자 A의 코드 포인트는 65이다. 다음 아래는 아스키 코드 중 제어 문자와 확장 아스키 코드를 제외한 부호(영문 자판에 사용되는 부호)를 정리한 것이다. 밑줄친 것들은 자주 사용하는 아라비아 숫자, 영어 대소문자를 표시한 것이다.
아스키 코드는 매우 간단하게 인코딩 된다는 장점이 있지만 단점으로는 한글을 표현할 수 없다. 한글뿐만 아니라 아스키 문자 집합 외의 모든 문자, 특수문자도 표현할 수 없다. 근본적으로 아스키 문자 집합에 속한 문자들은 7비트로 표현하기에 128개 보다 많은 문자를 표현할 수 없다. 더 다양한 문자 표현을 위해 아스키 코드에 1비트를 추가한 8비트의 확장 아스키Extended가 등장하기도 했지만, 그럼에도 표현할 수 있는 문자의 수는 256개여서 많이 부족하다. 이러한 이유로 등장한 한글 인코딩 방식이 EUC-KR이다.
3️⃣ EUC-KR
한글 인코딩을 알려면 우선 한글의 특수성을 알아야한다. 알파벳을 쭉 이어 쓰면 단어가 되는 영어와 달리, 한글은 각 음절 하나하나가 초성, 중성, 종성의 조합으로 이루어져 있다. 그래서 한글 인코딩에는 두가지 방식이 존재한다.
1) 완성형 인코딩
초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식이다. 예를 들어 '가'는 1, '나'는 2, '다'는 3, 이런 식으로 인코딩하는 방식이다.
2) 조합형 인코딩
초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여서 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식이다. 다시 말해 초성, 중성,종성에 해당하는 코드를 합하여 하나의 글자 코드를 만드는 인코딩 방식
EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩 방식이다. 즉, EUC-KR 인코딩은 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드를 부여한다.
예를 들어 '강'은 11101010 10110000 10010101(2) 16비트로 표현한 '강'
2바이트 코드가 부여된다는 것은 EUC-KR로 인코딩된 한글 한 글자를 표현하려면 16비트가 필요하다. 또한, 16비트는 네 자리 16진수로 표현할 수 있다.
예를 들어 '가'는 b0a0행의 두 번째 열인 b0a1(16)로 인코딩되고, '거'의 경우 b0c0행의 여섯 번째 열인 b0c5(16)로 인코딩된다.
EUC-KR 인코딩 방식으로 총 2,350개 정도의 한글 단어를 표현할 수 있다. 아스키 코드 보다 표현할 수 있는 문자가 많아졌지만, 모든 한글 조합을 표현할 수 있을 정도로 많은 양은 아니다. 그래서 문자 집합에 정의되지 않은 '뷁', '쀓'과 같은 글자는 EUC-KR로 표현할 수 없다.
모든 문자를 표현할 수 없다는 것은 크고 작은 문제를 야기하는데. EUC-KR 인코딩을 사용하는 웹사이트의 한글이 깨진다던지, EUC-KR 방식으로 표현할 수 없는 이름으로 인해 은행, 학교 등에서 피해를 받는 사람이 생겨나기도 했다.
이런 문제를 조금이라도 해결하기 위해서 만들어진 것이 마이크로소프트의 CP949Code Page 949이다.
하지만 CP949는 EUC-KR의 확장버전으로, EUC-KR로는 표현할 수 없는 더욱 다양한 문자를 표현할 수 있으나 이마저도 한글을 표현하기엔 부족하다.
4️⃣ 유니코드와 UTF-8
EUC-KR 인코딩 덕분에 한국어를 코드로 표현할 수 있게 되었다. 하지만 모든 한글을 표현할 수 없다는 한계도 있고 다국어를 지원하는 웹사이트를 만든다고 할 경우 사이트를 만들 때 각 나라 언어의 인코딩을 모두 알아야 하는 번거로움이 존재한다. 예를 들자면 한국어, 영어, 일본어, 중국어를 지원하는 웹사이트가 있다면 네 개의 언어 인코딩 방식을 모두 이해하고 지원해야 한다.
모든 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식이 있다면 언어별로 인코딩하는 수고를 덜 수 있다. 그래서 유니코드(unicode) 문자 집합이 생겼다. 한글을 포함한 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.
아스키 코드나 EUC-KR은 글자에 부여된 값을 그대로 인코딩 값으로 삼았다. 유니코드는 글자에 부여된 값 자체를 인코딩된 값으로 삼지 않고 UTF-8, UTF-16, UTF-32등의 방법으로 인코딩한다.
여기서 가장 대중적인 것은 UTF-8 방식이다. 통상 1바이트부터 4바이트까지의 인코딩 결과를 만들어낸다. 다시 말해 UTF-8로 인코딩한 값의 결과는 1바이트가 될 수도 2바이트, 3, 4바이트가 될 수도 있다. UTF-8로 인코딩한 결과가 몇 바이트가 될지는 유니코드 무낮에 부여된 값의 범위에 따라 결정된다.
● 유니코드 문자에 부여된 값의 범위가 0부터 007F(16)까지는 1바이트로 표현
● 유니코드 문자에 부여된 값의 범위가 0080(16)부터 07FF(16)까지는 2바이트로 표현
● 유니코드 문자에 부여된 값의 범위가 07FF(16)부터 FFFF(16)까지는 3바이트로 표현
● 유니코드 문자에 부여된 값의 범위가 10000(16)부터 10FFFF(16)까지는 4바이트로 표현
참고자료 -
'CS' 카테고리의 다른 글
[CS] ALU와 제어장치 (0) | 2023.01.31 |
---|---|
[CS] 다양한 주소 지정 방식 (0) | 2023.01.19 |
[CS] 명령어의 구조 (0) | 2023.01.17 |
[CS] 소스코드와 명령어 (0) | 2023.01.14 |
[CS] 0과 1로 숫자를 표현하는 방법 (0) | 2023.01.10 |