[java] 한글 인코딩 UTF8에 관해
개요
늘, 개발하면서 접하는 인코딩에 대해 정리를 한번 하고자 한다. 모든 문자는 컴퓨터가 인식할수 있는 0과 1의 2진수로 변경된다. 1비트에 저장공간에 0 또는 1이 들어가게 되는데, 8비트를 1바이트라고 하고, 1바이트는 2의 8제곱 만큼의 데이터를 표현할 수 있다. 0 과 1이 길어지면 불편하므로 16진수를 많이 사용하는데, 4비트 2진수에 대해 1자리수의 16진수로 변환할 수 있다. 예를 들어 2진수 0000은 16진수 0, 1111은 16진수로 f 이다.
유니코드
전 세계의 모든 문자를 하나의 통일된 문자표로 표현한 것이 유니코드 라는 것이다.(반명에 아스키코드는 숫자와 영어만을 문자표로 표현) 모든 문자를 모아놓고, 순서대로 번호를 붙였는데, 그 번호를 코드포인트(code point) 라고 하고 앞에 U+ 를 붙인다. U+는 유니코드를 의미한다. 예를 들어 대문자 A의 아스키코드는 0X41, 유니코드는 U+0041이 된다. 한글 ‘가’의 유니코드는 ‘U+AC00’ 이다. 0041, AC00 각각은 하나의 16진수로 이루어져 있다. 그러므로 4비트 X 6 = 16 비트, 거기에 U+해서 21비트를 가진다고 한다.
UTF-8
기존에 아스키코드로는 전세계 모든 문자를 표현할수 없어, 유니코드가 나왔고, 기존에 작성된 문서의 아스키코드와 호환을 위해 문자인코딩 UTF-8이 도입되었다.
아래 그림은 유니코드표의 일부이고, 글자 ‘안’을 찾아보면 유니코드는 U+C548 이 된다.
C548을 2진수로 풀면, 1100 0101 0100 1000이다.
UTF8은 코드포인트 범위에 따라 1바이트, 2바이트 3바이트, 4바이트로 표현하게 되는데(가변방식), C548처럼 한글은 3바이트로 표현한다.
아래 x에 좌측의 값이 순서대로 그대로 들어가면 된다.
1100 0101 0100 1000 => 1110 xxxx 10xx xxxx 10xx xxxx
최종 결과는 1100 1100 1001 0101 1000 1000 이 된다.
EUC-KR 은 모든 문자를 2바이트로 변환한다.
BASE64
BASE64를 사용하는 가장 큰 이유는 바이너리 데이터를 텍스트 기반 규격으로 다룰수 있어서이다. 파일등을 BASE64인코딩하면 UTF-8과 호환 가능한 문자열을 얻을 수 있다.
Leave a comment