데이터 - 0과 1로 문자 표현하기
문자집합(character set)
- 컴퓨터가 이해할 수 있는 문자들의 집합
문자 인코딩(character encoding)
- 문자 집합에 속한 문자를 컴퓨터가 이해하는 0과 1로 이루어진 문자 코드로 변환하는 과정
문자 디코딩(character decoding)
- 0과 1로 표현된 문자를 사람이 이해하는 문자로 변환하는 과정
인코딩, 디코딩 그리고 문자 집합을 이해하는 것은 개발을 하는 데 있어 매우 중요하다. 만약에 컴퓨터가 이해할 수 없는 문자집합을 사용하거나 인코딩 또는 디코딩이 제대로 이루어지지 않았을 경우 다음과 같은 문자 깨짐 증상을 보게 된다.
그렇기 때문에 개발 도중 문자 깨짐 증상을 보게 된다면 가장 먼저 확인해야 될 대상이 문자집합과 인코딩이다.
인코딩
그럼 먼저 인코딩의 종류를 알아보자.
아스키(ASCII)
- 초장기 컴퓨터에서 사용하던 문자 집합 중 하나로, 영어의 알파벳과 아라비아 숫자, 일부 특수 문자를 포함한다.
- 하나의 아스키 문자를 표현하기 위해서는 8비트(1바이트)를 사용한다.
- 8비트 중 1비트는 패리티비트(오류검춤을 위해 사용되는 비트)로 실질적으로 문자 표현은 7비트를 사용한다.
- 7비트로 표현할 수 있는 정보의 가짓수는 2^7개으므로 총 128개의 문자를 표현한다.
- 아스키 코드
- 아스키 문자들을 0부터 127까지의 숫자 중 하나의 고유한 수에 대응하여 인코딩 문자로 활용한다.
- 아스키코드의 인코딩 방식 - 2진수로 표현함으로써 아스키 문자를 0과 1에 대응한다
- 예를 들어 문자 'A'는 10진수 65(이진수 1000001)로 인코딩 되고, 'a'는 10진수 97(이진수 1100001)로 인코딩 된다.
EUC-KR
아스키코드엔 단점이 존재한다. 표현할 수 있는 문자의 수가 적기 때문에 한글을 표기할 수 없다. 그래서 등장한 인코딩 방식 중 하나가 EUC-KR이다.
- EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합 기반의 인코딩 방식이다.
- 아스키 문자를 표현할 때는 1바이트, 하나의 한글 글자를 표현할 때는 2바이트 크기의 코드를 부여한다.
- 2바이트(16비트)는 네 자리 16진수로 표현할 수 있으므로, EUC-KR로 인코딩 된 한글 글자 하나는 네 자리 16진수로 나타낼 수 있다.
- EUC-KR의 인코딩 방식은 아스키와 완벽하게 똑같다. 한글 글자 마자 고유하게 부여되는 숫자가 있으며, 대응되는 숫자로 인코딩 된다.
- EUC-KR 인코딩 방식을 사용하면 총 2,350개 정도의 한글 단어를 표현할 수 있다.
- 이스키코드에 비하면 많아졌지만, 아직도 모든 한글 조합을 표현할 수 있지는 않다. 예를 들어 `쀓`, `똠`과 같은 글자는 EUC-KR로 표현할 수 없다.
유니코드(Unicode)
그래서 등장한 것이 유니코드 문자집합니다.
- 유니코드는 한글을 포함해 EUC-KR에 비해 훨씬 많은 언어, 특수문자, 화살표, 이모티콘까지 코드로 표현할 수 있는 통일된 문자집합이다.
- 유니코드는 대부분의 언어를 지원하며, 국가별로 다른 문자집합과 인코딩 방식을 준비할 필요가 없다.
- 현재는 유니코드가 가장 많이 사용되는 표준 문자 집합이다.
- 아스키코드나 EUC-KR처럼 유니코드 문자 집합에 속한 문자에 고유한 값이 부여되어 있다.
대부분에 언어를 지원하기 때문에 다국어를 지원하는 홈페이지 개설 때 편리하게 사용될 수 있다.
유니코드의 특징
- 아스키코드나 EUC-KR은 글자에 부여된 값을 그대로 인코딩 값에 사용한다.
- 하지만 유니코드는 글자에 부여된 값 자체를 인코딩 값(코드 포인트)으로 삼지 않고, 이 값을 다양한 방법으로 인코딩한다.
- 대표적인 방식으론 UTF-8, UTF-16. UTF-32가 있으며, 유니코드 문자에 부여된 값을 인코딩한다.
- UTF-8, UTF-16. UTF-32은 가변 길이 인코딩이다. 인코딩 된 결과의 길이가 일정하지 않을 수 있음을 의미한다.
base64
마지막으로 base64 인코딩 방식에 대해 알아보자.
- base64는 문자뿐만 아니라, 이진 데이터까지 변환할 수 있는 인코딩 방식
- 문자보다는 이진 데이터를 인코딩하는 데에 더 많이 사용된다.
- 이미지 등 단순 문자 이외의 데이터까지 모두 아스키 문자 형태로 표현 가능하다.
base64는 64진법을 의미한다.
- 하나의 base64 인코딩 값을 표현하기 위해서는 64개의 문자가 필요하다.
- 그러므로 64진수 하나를 표현하기 위해선 2^6의 지수인 6비트가 필요하다.
- 따라서 변환할 데이터를 6비트씩 나누어 하나의 문자로 변환한다.
기본적으로 4개씩 한 번에 변환된다. 예를 들어 `abc`가 있다고 하면 8비트 아스키코드 97, 98, 99 로 인코딩 된다. 다음과 같이 아스키로 표현된다. 여기서 base64로 인코딩한다면 6비트씩 4개씩 잘라 24비트가 한번에 변환된다. (YWJj)
하지만 위 예제처럼 6비트씩 딱 나누어 떨어지지 않는 경우가 존재한다. `ab`의 경우 총 16비트이므로 4개의 6비트로 나누어 떨어지지 않는다.
이 경우 떨어지지 않는 자리에 0 값을 채우는 패딩(padding)을 이용하고, 부족한 비트는 0으로 간주되어 `=`로 인코딩된다.
참고
이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접 - 강민철
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[컴퓨터구조] CPU 성능 향상을 위한 설계 (클럭, 코어, 스레드) (0) | 2024.11.25 |
---|---|
[컴퓨터구조] CPU - 인터럽트 (0) | 2024.11.08 |
[컴퓨터구조] CPU - 레지스터 (0) | 2024.10.31 |
[컴퓨터구조] 컴퓨터가 이해하는 정보 - 명령어 (0) | 2024.10.28 |
[컴퓨터 구조] 컴퓨터 구조의 큰 그림 (0) | 2024.10.21 |