본문 바로가기
프로그래밍

문자열 인코딩에 대한 정리

by 탁구치는 개발자 2015. 8. 19.

[유니코드란?]

유니코드는 세계 각국의 문자를 하나의 문자코드체계로 제안된 규격이며 기본적으로 한 글자에 2byte(16bit)의 데이터를 사용한다.

http://unicode-table.com/ 페이지에 나와 있는 코드들이 세계 각각의 문자를 모두 표현할 수 있는 유니코드들인 것이다.

그럼 2byte로 되어 있는 저많은 코드들이 어떻게 한글 또는 알파벳으로 표현되는지 알아보겠다.


먼저 아래 표를 보면 세로 축에 0040 가로축에 1 값이 강조되어 있는 것을 볼 수 있다.

해당 값들을 조합하면 0041과 같은 형태가 되는데 이것이 알파벳 A를 표현할 수 있는 2byte의 유니코드이다.


0041 유니코드 값이 A로 변환되는 과정을 확인하기 위해 이클립스에서 테스트를 진행해 보면 다음과 같이 A가 표현되는 것을 확인할 수 있다. 

\u 값을 붙여주는 이유는 해당 값이 유니코드라고 의미를 부여해 주는 것이라고 알면 될 것이다. (코드 포인트라고도 부름)


위의 java 파일을 컴파일 한 뒤에 생성되는 class 파일을 디컴파일해보면 컴파일 타입에 유니코드 값들이 알파벳으로 이미 변환되어 있는 것도 확인할 수 있다.




[문자셋 인코딩]

UTF-8, UTF-16, EUC-KR들은 유니코드가 아니고 유니코드를 인코딩하는 방식을 말한다.

이미 유니코드를 이용하여 전세계의 모든 문자들을 표현 할 수 있는데 위에 나열된 인코딩 방식들이 왜 필요하나라는 의문을 가질 수 있을 것이다. 그 이유는 문자를 표현하기 위한 용량을 줄이기 위해서이다.

UTF-8은 1~4byte까지 가변적으로 인코딩

- 영문 1byte

- 한글 3byte


UTF-16은 2~4byte까지 가변적으로 인코딩

- 영문 2byte

- 한글 2byte


UTF-32는 4byte 고정 인코딩


다음은 알파벳 'a'와 한글 '가'를 인코딩한 결과이다.

알파벳 : a

한글 : 가


====================================

UTF-8

====================================

알파 : [97]

한글 : [-22, -80, -128]


====================================

UTF-16

====================================

알파 : [-2, -1, 0, 97]

한글 : [-2, -1, -84, 0]


====================================

UTF-16BE

====================================

알파 : [0, 97]

한글 : [-84, 0]


====================================

UTF-16LE

====================================

알파 : [97, 0]

한글 : [0, -84]


====================================

UTF-32

====================================

알파 : [0, 0, 0, 97]

한글 : [0, 0, -84, 0]

유니코드에서 '가'는 16진수로 'AC00' 이고, UTF-8 인코딩으로 표현하면 위와 같이 3바이트로 나타낼 수 있다.

http://unicode-table.com/en/AC00/