프로그래밍과 용어와 잡담

Unicode (유니코드)

소혼 2011. 5. 11. 01:06
반응형

매번 볼때마다 늘 나를 좌절하게 만드는 유니코드;;

유니코드 정의 자체는 간단합니다.

'전세계 모든 문자를 표현하는 문자셋(charset set)'

문자셋이란 그냥 테이블이라고 생각하면 편할 것 같습니다.


컴퓨터는 숫자만을 인식하기 때문에 직접 문자를 인식할 방법이 없어서 이러한 문자셋을 참조하여 문자를 구분합니다. 97(0x61)번째 문자는 'a' 이다 이런식입니다.




컴퓨터에서 가장 많이 쓰이는 문자셋에는 ASCII가 있습니다.
1바이트안에 저장할 수 있고(128문자 사용) 영어권에서는 큰 문제가 없었습니다.

하지만 유럽으로 넘어가보면 알파벳만으로 표현이 안되는 문자들이 있습니다. (예, 독일어 : Ä/ä, Ö/ö, Ü/ü )
그래서 각 나라에서는 자신만의 문자셋을  만들었습니다.

한글도 마찬가지로 별도의 문자셋을 갖고 있습니다. KS C5601 입니다.

이런게 중구난방으로 난립하게 되자, 이를 표준화하려는 움직임이 나타나는데 그 결과물이 유니코드입니다.
그 전에 ISO에서 UCS(Universal Character Set)라는 표준을 정했는데 이와 별도로 유니코드 컨소시엄이 생겨나 유니코드를 만들었습니다. 그냥 UCS는 일단 크게 신경 안써도 될 것 같습니다.

유니코드가 문자셋이라면 각각의 문자의 위치(를 나타내는 번호)는 코드 포인트라고 합니다.
U+0061이 코드 포인트이고, 그 코드 포인트가 가르키는 값은 알파벳 a 입니다.

그런데 이러한 유니코드를 컴퓨터의 메모리나 파일에 저장하려고 하니 문제가 발생했습니다.
기존의 ASCII는 1바이트 안에 저장할 수 있었지만, 유니코드는 많은 코드 포인트를 갖고 있기 때문에 1바이트안에 저장할 수 없습니다.
메모리를 넉넉하게 쓰면 좋겠지만, 기존 ASCII와 호환성 문제가 생깁니다.
사실 기존의 ASCII가 커버하고 있는  1바이트 문자(char)를 버리는게 좋겠지만 기존의 프로그램들도 있고, 영어권 국가가
좋아할 리가 없지요.
그래서 몇가지 인코딩 방법을 도입하게 됩니다.

기존의 ASCII는 아래처럼 인코딩이라는 개념이 큰 의미가 없습니다. 코드 포인트와 메모리에서 동일하게 유지하며 매 바이트가 한개의 글자를 표현합니다.
코드 포인트(0x61) --- {인코딩} --> 메모리(0x61)
하지만 유니코드가 되면 아래와 같은 문제가 생깁니다.
코드 포인트(U+0061)  --- {인코딩} --> 메모리(?)
코드 포인트(U+AC00)  --- {인코딩} --> 메모리(?) 


U+0061은 ASCII 0x61과 같습니다.

1) 호환성을 위해 U+0061은 1바이트에 저장하고 U+AC00 (가) 를 위해 2바이트에 저장하는 방법도 있을 것이고,
2) 둘 다 2바이트에 저장하는 방법도 있을 것입니다. (2바이트 이상 필요한 것들만 4바이트에 저장)
3) 유니코드를 모두 표현할 수 있도록 4바이트에 저장하는 방법도 있을 것입니다. 


즉, 유니코드의 코드 포인트는 같지만 메모리상에 저장할때는 위 방법들 가운데 하나를 선택하게 되는데 이를 인코딩이라고 하고 이렇게 저장된 인코딩 문자들을 1) UTF8, 2) UTF16, 3) UTF32 라고 합니다.
어떤 방법으로 저장하든 결국 같은 유니코드의 코드 포인트를 갖고 있습니다.

그러나 시스템등의 필요에 맞게 변환이 필요할 수 있습니다.
즉, 특정 프로그램이나, 프로그램을 작성할 때
1) 코드셋이 맞도록 코딩 되어야 합니다.  KS C5601 과 Unicode는 다른 문자셋이므로 문자가 다 깨져서 보일 수 있습니다.
2) Unicode의 경우 UTF8, UTF16, UTF32에 따라 읽어드리는 방법이 바뀌므로 조심해야 합니다. 필요한 경우 변환과정을 작성해야 할 수 있습니다.

되도록 추천하는 방법은 UTF8을 쓰는 것입니다.

우리나라에서는 EUC-KR을 쓰는 경우도 많은데 이 문자셋으로 저장된 데이터가 너무 많아서 쉽게 버릴수 없다는 안타까움이 있습니다.(참고 : http://kldp.org/node/64052 )

PS. 그리고 웹 개발하시는 분들은 제발 encoding좀 넣어주세요.ㅠ_ㅠ 아래와 같이 넣으면 됩니다.
<meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8" />
 정 안되면 EUC-KR을 쓰셔도 크게 문제는 없습니다.
<meta http-equiv="Content-Type" content="text/htmlcharset=euc-kr" /> 

이게 없으면 webkit 기반 브라우저(크롬, 사파리 등)에서는 encoding detection을 해야 하는데 이게 잘 안되는 경우가 많습니다.

반응형

'프로그래밍과 용어와 잡담' 카테고리의 다른 글

Foreign function interface  (0) 2011.05.16
안드로이드 해상도 WVGA, HVGA, qHD?  (26) 2011.05.11
괄호를 영어로 읽으면?  (0) 2011.04.27
DAG  (0) 2011.04.16
DVCS  (0) 2011.04.16