# 자바 - 컴퓨터와 문자 인코딩

## 문자 집합과 인코딩

컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 **문자 집합**(character set)이라고 한다. 컴퓨터는 문자 집합에 속해 있는 문자를 이해할 수 있고, 반대로 문자 집합에 속해 있지 않은 문자는 이해할 수 없다.

문자 집합에 속한 문자라고 해서 컴퓨터가 그대로 이해하는 것은 아니다. 문자를 `0`과 `1`로 변환해야 컴퓨터가 이해할 수 있다. 이 변환 과정을 **문자 인코딩**(character encoding)이라 하고 인코딩 후 `0`과 `1`로 이루어진 결과값이 문자 코드가 된다. 같은 문자 집합에 대해서도 다양한 인코딩 방법이 있을 수 있다.

인코딩의 반대 과정, 즉 `0`과 `1`로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정은 **문자 디코딩**(character decoding)이라고 한다.

예를 들어 문자 `A`를 저장하면, 컴퓨터는 문자 집합을 통해 `A`의 숫자 값 65를 찾고, 65를 메모리에 저장한다.(2진수로 변환해서) 메모리에 저장된 문자를 불러올 때는 반대로 작동한다. 메모리에 저장된 숫자 값 65를 불러오고, 문자 집합을 통해 문자 `A`를 찾아서 출력한다.

***

## ASCII 문자 집합

**ASCII**(American Standard Code for Information Interchange) 는 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 일부 특수 문자를 포함한다.

아스키 문자 집합에 속한 문자(아스키 문자)들은 각각 7비트로 표현되어 총 2^7(128)개의 문자를 표현할 수 있다.

[위키백과 - ASCII](https://ko.wikipedia.org/wiki/ASCII)

아스키 코드는 간단하게 인코딩된다는 장점이 있지만, 한글을 포함한 아스키 문자 집합 외의 문자, 특수문자를 포함할 수 없다는 단점이 있다.

근본적으로 7비트로 표현하기 때문에 128개보다 많은 문자를 표현하지 못하기 때문이다. 더 다양한 문자 표현을 위해 아스키 코드에 1비트를 추가한 8비트의 **확장 아스키**가 등장하기도 했지만, 그럼에도 표현 가능한 문자의 수는 256개로 턱없이 부족했다.

그래서 한국을 포함한 영어권 외의 나라들은 자신들의 언어를 `0`과 `1`로 표현할 수 있는 고유한 문자 집합과 인코딩 방식이 필요하다고 생각했다. 이런 이유로 **EUC-KR**이라는 한글 인코딩 방식이 등장했다.

***

## EUC-KR

초창기 등장한 한글 문자 집합으로, 모든 한글을 담는 것 보다는 자주 사용하는 한글 2,350개만 포함해서 만들었다.

한글의 글자는 아주 많기 때문에 256가지만 표현할 수 있는 1byte로 표현하는 것은 불가능하다. 그래서 2byte(16bit)로 총 65,536가지를 표현한다.

ASCII는 1byte, 한글은 2byte를 사용한다. (영어는 1byte, 한글은 2byte를 메모리에 저장)

EUC-KR은 '쀍', '쀓', '믜' 같은 글자는 표현할 수 없다. 이런 문제를 조금이나마 해결하기 위해 등장한 것이 마이크로소프트의 CP949이다. **CP949**는 EUC-KR의 확장된 버전으로 더욱 다양한 문자를 표현할 수 있지만, 한글 전체를 표현하기에 넉넉한 양은 아니다.

***

## 유니코드

다양한 문자 인코딩 표준이 존재했지만, 이들은 모두 특정 언어 또는 문자 집합을 대상으로 했기 때문에 국제적으로 호환성 문제가 많았다.

이를 해결하기 위해 전 세계의 모든 문자들을 단일 문자 집합으로 표현할 수 있는 **유니코드** 표준이 생겨났다. (UTF-16, UTF-8의 시작)

### UTF-16

16bit(2byte) 기반의 문자 집합으로 자주 사용하는 기본 다국어들은 2byte로 표현한다.(65,536가지 표현 가능)

큰 단점이 있는데 **ASCII 영문도 2byte를 사용한다는 점**이다. 그래서 UTF-16을 사용한다면 영문의 경우 다른 문자 집합보다 2배의 메모리를 더 사용한다.(웹에 있는 문서의 80% 이상은 영문 문서) 그리고 ASCII와 호환되지 않는다는 점도 큰 단점 중 하나이다.

대부분의 문자를 2byte로 처리하기 때문에 계산이 편리하다는 장점이 있다.

### UTF-8

8bit(1byte) 기반의 가변 길이 인코딩 문자 집합으로, 1byte \~ 4byte를 사용해서 문자를 인코딩한다.

UTF-16에 비해 상대적으로 사용이 복잡하고, ASCII를 제외한 일부 언어에서 더 많은 용량을 사용한다는 단점이 있다.

그러나 **ASCII 문자는 1byte로 표현하여 ASCII와 호환된다는 장점이 있다.**

**UTF-8**은 **현대의 사실상 표준 인코딩 기술**이다. 현재 대부분의 웹사이트와 애플리케이션에서 기본 인코딩으로 사용한다.

***

[메인 ⏫](https://github.com/genesis12345678/TIL/blob/main/Java/adv_1/Main.md)

[다음 ↪️ 문자 인코딩 - 문자 인코딩 예제](https://github.com/genesis12345678/TIL/blob/main/Java/adv_1/charset/example.md)
