본문 바로가기
애자일(Agile)개발방법론

[ETC] 다국어 개발 Unicode 란? UTF-8 이란? UTF-16이란?

by swconsulting 2015. 2. 27.

프로젝트 초반에 꼭 고려해야 하는 요소가 있다. 바로 다국어처리 이다. 이 다국어 처리를 하기 위해서 꼭 알고 있어야 하는 개념이 아래 3가지 이다.


[1]Unicode 


어렵게 생각하면 끝도 없다. 하지만 단순하게 생각해서 코드 테이블 인덱스 값이다. 모든 문자에 대해서 Unique한 넘버를 부여한것이 Unicode이다. 이 Unicodes는 플랫폼, 운영체제, 언어에 독립적이다. 


Unicode provides a unique number for every character,

no matter what the platform,
no matter what the program,
no matter what the language


http://www.unicode.org/standard/WhatIsUnicode.html


[2]UTF-8

UTF 약어이고 원래 뜻은 (Unicode Transformation Format)이다. 즉, Unicode를 인코딩하는 방법이다. 

8의미는 8비트 1바이트를 기준으로 인코딩한다는 의미이다.


중요한 점은 유니코드를 인코딩하는 방식중 하나라는 의미이다.


[3]UTf-16

UTF8과 동일하다.UTF 약어이고 원래 뜻은 (Unicode Transformation Format)이다. 즉, Unicode를 인코딩하는 방법이다. 

16비트로 인코딩한다는 의미이다.


중요한 점은 유니코드를 인코딩하는 방식중 하나이다.


[UTf-8, UTF-16비교]


코드 범위(십육진법)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로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.
<표 출처 위키백과>

위 표를 참고해서 '위'를 UTF-8로 변환하면,
1) '위' -> (U+C704) 유니코드 인덱스를 가진다.
2) '위'는 U+0800~U+FFFF사이에 있는 글자이다. 표현을 (1110xxxx 10xxxxxx 10xxxxxx)이렇게 해야 한다.
3) 16진수 C704를 이진수로 표현하면 -> 1100-0111-0000-0100 이다.
4) 3)결과를 2)표현식에 매핑하면 11101100 10011100 10000100 이다 
5) 4)결과를 바탕으로 3바이트로 인코딩되면 16진수로 표시하면 EC 9C 84 이다.

[UTF-8 <-> UTF16 변환]
UTF-8 <-> UTF-16 서로 변환은 100% 잘된다. 위에서 설명했듯이 Unicode Index(인덱스)를 표현하는 방식만 다르기 때문에 서로간의 호환은 잘된다.

여기서 1가지 고려해야 하는 점은 윈도우는 UTF16이 디폴트이다. 하지만 웹 또는 데이타 베이스에서는 UTF-8을 대부분 주로 사용한다. 즉, 이점을 유의해야 한다.

웹 REST API를 통해서 데이터를 HTTP POST/GET으로 주고 받을때 아래 절차를 따라야 한다.

HTTP SEND -> 문자열 -> UTF16 -> UTF8 변환 -> HTTP SEND
HTTP RECV -> JSON 문자열 -> UTF8  변환(바이트) -> UTF16(문자열(스트링)변환)

[글자 처리]

우리가 글자 "가"를 쓴다고 해 보자.  글자 "가"는 1글자이다.
그러므로 "가"를 나타내는 index가 있다. 물론 "나"를 나타내는 index도 있다.

한글로 표현할 수 있는 글자는 매우 많다.
그 많은 글자 모두에게 index를 줄 수가 없다.

현재 사용하고 있는 모든 글자에 index를 준다고 해도,
시간이 지나서 새로운 글자가 추가 되어 index가 모자르게 된다면 어떻게 할것인가?

그래서 유니코드는 완전한 글자를 제공해 주기도 하지만,
글자를 조립할 수 있도록 조립가능한 글자를 제공해 준다.

다시 "가"를 쓴다고 해 보다.
"가"라는 글자는 1개이지만, 실제로는 초성 "ㄱ"과 중성"ㅏ" 가 합쳐져서 만들어진 글자이다.

그러므로 "가"를 표현하는 방법은 완성된 글자 "가"0xAC00가 될 수도 있고,
초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.
( 초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK )
( 중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A )

이를 조합할 수 있게 해 주는 index는 1100 부터 있다.
( Hangul Jamo - Korean combining alphabet - http://www.unicode.org/charts/PDF/U1100.pdf )


이는 비단 한글뿐만 아니라, 
일본어 역시 완성된 글자가 있기도 하고, 조합할 수 있게도 되어 있다.

영어 역시 그렇다. 영어에서 무슨 글자를 조합하냐 라고 말하겠지만,  
이력서를 나타내는 Resume 의 경우에는 e 와 ' 의 조합으로 이루어 질 수도 있다.