문자열 인코딩에 대한 정리
[유니코드란?]
유니코드는 세계 각국의 문자를 하나의 문자코드체계로 제안된 규격이며 기본적으로 한 글자에 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/
'프로그래밍' 카테고리의 다른 글
tag 라이브러리 동작 원리에 대해서 생각해 보자 (0) | 2016.01.18 |
---|---|
Spring Scoped Proxy Beans (prototype 빈 DI로 주입해서 사용) (0) | 2016.01.14 |
Java Generic 정리 (3) | 2016.01.13 |
Spring RestTemplate 사용 시 HTTP request, response 로그 남기기 (0) | 2015.10.16 |
Servlet의 request, response와 JSP의 request, response는 서로 다른 객체 (0) | 2015.07.23 |
SimpleDateFormat 쓰레드 세이프 하지 않음 (0) | 2015.07.02 |
mybatis multiple select key (2) | 2015.05.21 |
iframe사이트와 parent사이트간 메세지 전송 방법 (서로 도메인이 다른 경우) (0) | 2015.05.21 |