Character Set.

Encode. Encoding.


인코딩의 종류는 너무나도 많다. 그걸 한 번 정리해보자.


Reference : 

https://kldp.org/node/129659


UNICODE

유니코드. 인코딩이라기보다는 개념이다.

문자열을 숫자로 표현하기 위하여, 문자 하나와 숫자 하나를 각각 매핑한 것이 바로 유니코드이다.

매핑은 한글로 하면 사상인데, 쉽게 연결이라고 생각하자.

예를 들어 A는 U+0041에 매핑되어있고, '가'는 U+AC00에 매핑되어있다.


그리고, 이 유니코드를 저장하는 방법에는 다양한 방법이 있다. UTF-8, UTF-16 등, 살펴보자!


 - UTF-8

컴퓨터를 다루면서 자주 보았을 UTF-8은 유니코드 인코딩 중에 하나로, 문자열을 8-bit 기반으로 저장한다. ANSI 문자(영어 포함)는 그대로(1 바이트로) 아시아 문자는 3 바이트로 가변 표기하는 인코딩 방식이다.

https://ko.wikipedia.org/wiki/UTF-8

위키에 잘 설명되어있다.

'가'를 UTF-8로 표기하려면

범위상 1110xxxx 10xxxxxx 10xxxxxx에 해당하고

'가'가 매핑된 U+AC00은

0xAC00 = 44,032 = 10101100 00000000 이고

이제 x 표시한 부분에 순서대로 넣어주면 된다. 보기 편하게 색깔을 넣어줬다.


11101010 10110000 10000000

234       176        128

EA        B0          80


이런 식으로 UTF-8이 완성된다.

A는 그냥 U+0041 -> 0x41이다. 이제 한글이 왜 3 바이트인지 이해가 되는가?


이런 점에서 UTF-8로 영어 문서를 작성할 경우, 문서의 용량을 줄일 수 있다. 게다가 ANSI와 호환도 된다는 장점이 있다.


여담이지만, URL의 %41도 UTF-8이다.

URL Encode, Percent Encode는 %를 붙인 UTF-8 인코딩이라고 할 수 있다.


 - UTF-16

https://ko.wikipedia.org/wiki/UTF-16

UTF-8이 8-bit 기반이듯 UTF-16은 16-bit 기반으로 문자열을 저장한다.

그래서 UTF-16은 모든 문자를 2 바이트로 저장한다는 이야기가 있는데

그것은 미신이다. 위키에서도 설명하듯, BMP의 문자들은 2 바이트 그대로 인코딩되고, 그 이상의 문자는 특별한 방식으로 4 바이트 인코딩된다. BMP는 UCS-2에서 설명하겠다.

즉, UTF-16도 엄연한 가변 표기 인코딩이라는 것이다. 알아만 두자.


UTF-16에서 중요한 것은, 16-bit 기반으로 문자를 저장함으로써 한글 또한 2 바이트로 저장할 수 있다는 것이다.

이를 통해 한글 문서의 용량을 줄일 수 있을 것이다. 그 외에 영어+한글 처리 시 크기가 모두 2 바이트이므로 UTF-8보다 편리한 경우도 있겠다.

그러나 ANSI와 호환이 안될 뿐더러, 2 바이트이기 때문에 리틀엔디안, 빅엔디안이 필요하다는 단점이 생긴다.

< 윈도우즈 메모장notepad에서 텍스트 파일 저장 시, 유니코드, 유니코드(big endian)이 바로 UTF-16에 해당한다. >


 - UCS-2

https://ko.wikipedia.org/wiki/유니코드


위 링크에서 확인할 수 있는 유니코드 목록을 보면, 기본 다국어 평면 BMP(Basic Multilingual Plane) 부분이 있다.

https://ko.wikipedia.org/wiki/국제_문자_세트

위키에 UCS는 국제 문자 세트(UCS, Universal Character Set, 범용 문자 집합)라고 소개되어있다.


쉽게 설명하자면

UCS-2 인코딩은 U+0000 ~ U+FFFF 영역만을 표기할 수 있다.

그리고 모든 문자는 UTF-16과 같이 2 바이트로 표기된다.(그래서 UCS-2)

이게 전부다.


ANSI code(=ASCII)

ASCII(American Standard Code for Information Interchange)

ANSI code와 ASCII 둘 다 같은 말이라고 생각하면 된다.

ASCII table을 기준으로 인코딩 한 것이 ANSI encoding이라는 것이 필자의 추측.


ANSI로 표현가능한 문자들은 asciitable.com에서 확인가능하다.

유니코드 중 0x00~0x7f에 해당한다.


그런데, ASCII table에는 한글이 없는데

메모장에서 ANSI 인코딩은 어떻게 한글을 저장해요?

'가'는 B0 A1 로 저장되던데.


이에 대한 답은 다음 인코딩에 있다.


EUC-KR

한글 Windows의 메모장에서 이야기하는 ANSI 인코딩이란, EUC-KR을 말하는 것이다.

(틀린 부분이 있어 수정합니다. 댓글 감사합니다.)

한글 Windows의 메모장에서 이야기하는 ANSI 인코딩이란, CP949 (Code Page 949)을 말하는 것이다.

CP949는 EUC-KR의 확장이며, 하위 호환성이 있다.

EUC-KR이 뭐에요?

ANSI를 한국에서 확장한 것이다. 일본은 EUC-JP라고 한다.

EUC-KR 코드표를 확인해보면 B0 A1에 '가'가 매핑되어있는 것을 확인할 수 있다.




너무 많다 싶으면 UTF-8과 유니코드의 개념에 대해서만 제대로 알아두면 거뜬할 것이다.

8-bit 기반이라는 점만 기억해두자.



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/