티스토리 뷰

Web Development

[웹개발] Unicode vs UTF-8

§무명소졸§ 2014. 1. 7. 13:30

"Unicode 와 UTF-8 의 차이점은 무엇인가요?"

위 질문에 대해서 정확하게 대답할수 있으면 더이상 읽지 않으셔도 됩니다.


Unicode 는 charset 이고 UTF-8은 Encoding 방법 입니다.


그럼 Charset 과 Encoding 은.. ? (보통 웹 개발에서 ..)


Charset   : 문자의 숫자표기(code point)

Encoding : 숫자의 비트표기



아래 간단한 예제 소스가 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
 
public class CTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "가";          //String 객체
        char c = '\uAC00';        //유니코드값
 
        System.out.println("uAC00=" + c);      //가
        System.out.println("'가'의 코드포인트:" + (int)c); //44032
 
 
        //"가"에대한 UTF-8 바이트배열을 구해서 int 값을 얻는다.
        byte[] bytes = s.getBytes("utf-8");
        int ut8Int = new BigInteger(bytes).intValue();
 
        System.out.println("'가' utf-8 인코딩 int 값:" + ut8Int); //-1396608
 
        String unicodeBit = Integer.toBinaryString(c);
        System.out.println("44302의 비트값:" + unicodeBit); //1010110000000000
 
        for (byte aByte : bytes) {
            System.out.println(Integer.toHexString(aByte & 0xff+ " : " + Integer.toBinaryString(aByte & 0xff));
        }
    }
}
cs


한글 "가" 에 대한 자바의 String 객체와 원시타입 표기 방법 입니다.

그중에서 살표 볼것은 char 로 표시된 형태 인데요


 String s = "가";          //String 객체
 char c = '\uAC00';        //유니코드값

\uAC00 는 "가" 에 대한 유니코드 값 입니다. 유니코드 검색하기 


\u 는 유니코드임을 뜻하고요 

뒤따라오는 AC00은 2byte 16진수 값입니다.(유니코드는 2byte) 



이 유니코드를 숫자로 표기하면 44032 라는 값이 나옵니다.

UTF-8 인코딩된 "가" 에 대한 코드포인트값을 얻기 위한 부분입니다.

 //"가"에대한 UTF-8 바이트배열을 구해서 int 값을 얻는다.
 byte[] bytes = s.getBytes("utf-8");
 int ut8Int = new BigInteger(bytes).intValue();
 
 System.out.println("'가' utf-8 인코딩 int 값:" + ut8Int); //-1396608



위 설명과 같다면  UTF-8 (Unicode Transformation Format) 은 코드 포인트는 44608(unicode의 '김' 의 값) 이라는 값을 가져야 되지만  -1396608 이라는 값을 가지고 있습니다.


사실 -1396608  이값 안에는 44608이라는 값이 있고 그 차이는 UTF-8의 인코딩 알고리즘에 의해 발생 하는것

입니다.


코드 범위
(십육진법)
UTF-16BE 표현
(이진법)
UTF-8 표현
(이진법)
설명
000000-00007F00000000 0xxxxxxx0xxxxxxxASCII와 동일한 범위
000080-0007FF00000xxx xxxxxxxx110xxxxx 10xxxxxx첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함
000800-00FFFFxxxxxxxx xxxxxxxx1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF110110yy yyxxxxxx 110111xx xxxxxxxx11110zzz 10zzxxxx 10xxxxxx 10xxxxxxUTF-16 서러게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.

(출처:http://ko.wikipedia.org/wiki/UTF-8)




 첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작하는 알고리즘이 있습니다.


즉 유니코드hex값이 AC00 인 한글 "가"의 binary 값은 1010110000000000  이것을 3등분 해서 utf-8 인코딩 알고리즘을 적용하면


11101010        //첫 바이트는 1110 시작      (hex값: EA)

10110000        //나머지 바이트는 10 시작    (hex값BO)

10000000        //나머지 바이트는 10 시작    (hex값80)



AC00(010110000000000)   ==> EAB080(111010101011000010000000)


결국 "가" 라는 한글은  AC00 이라는 2byte 유니코드값을 가지고 있고 

UTF-8 로 인코딩할때는 3byte 형태로 변경 되게 됩니다.



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크