티스토리 뷰
"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 로 표시된 형태 인데요
\uAC00 는 "가" 에 대한 유니코드 값 입니다. 유니코드 검색하기
\u 는 유니코드임을 뜻하고요
뒤따라오는 AC00은 2byte 16진수 값입니다.(유니코드는 2byte)
이 유니코드를 숫자로 표기하면 44032 라는 값이 나옵니다.
UTF-8 인코딩된 "가" 에 대한 코드포인트값을 얻기 위한 부분입니다.
위 설명과 같다면 UTF-8 (Unicode Transformation Format) 은 코드 포인트는 44608(unicode의 '김' 의 값) 이라는 값을 가져야 되지만 -1396608 이라는 값을 가지고 있습니다.
사실 -1396608 이값 안에는 44608이라는 값이 있고 그 차이는 UTF-8의 인코딩 알고리즘에 의해 발생 하는것
입니다.
코드 범위 (십육진법) | UTF-16BE 표현 (이진법) | UTF-8 표현 (이진법) | 설명 |
---|---|---|---|
000000-00007F | 00000000 0xxxxxxx | 0xxxxxxx | ASCII와 동일한 범위 |
000080-0007FF | 00000xxx xxxxxxxx | 110xxxxx 10xxxxxx | 첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함 |
000800-00FFFF | xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx | |
010000-10FFFF | 110110yy yyxxxxxx 110111xx xxxxxxxx | 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx | UTF-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 형태로 변경 되게 됩니다.
'Web Development' 카테고리의 다른 글
[자바] AES Encrypt Simple Java Source (0) | 2014.03.20 |
---|---|
[웹개발] 웹개발과 한글깨짐 (4) | 2014.02.13 |
[웹개발] XSS 와 CSRF 차이점 (0) | 2013.12.19 |
[정규식] 정규식을 이용한 패스워드 생성 제약조건 [영어,숫자,특수문자 ] 1자 이상 (0) | 2013.10.10 |
[웹개발] 첨부 파일 MIME Type 조회하기 (0) | 2013.07.05 |
- Total
- Today
- Yesterday