컨텐츠 바로가기

유니코드

http://chucky1.egloos.com/1185578

[펌] 유니코드에 대해서 기타자료

2007/05/04 10:09

http://blog.naver.com/hosang46/120037474602

디씨인사이드 프로그래밍갤러리에서 펌.

 

-------------------------------------

 

초보가 감히 유니코드에 대해 논한다면
그것만큼 우수운 일이 또 없지만

적어도 이 계시판에서 유니코드가 그리 만만찮은 놈이라는 것을 알려드리기 위해
제가 아는 대로만 써보겠습니다

원래 한글로 된 좋은 링크가 있었는데
http://www.jinsuk.pe.kr/Unicode/unicode-kr.html<- 링크 짤렸습니다
http://en.wikipedia.org/wiki/Unicode이건 위키디피아

유니코드를 이야기 하는데 있어 3가지가 필요합니다
유니코드를 이루는 글자 character repertoire
유니코드를 인코딩하는 방법  encoding methodology
마지막으로 글자에 매치되는 코드 standard character encodings
입니다

각각을 설명해 보겠습니다
우선 캐릭터 레파토리란 현재 우리가 쓰고있는 글자들을 뜻합니다
유니코드는 이 세상의 모든 문자를 담고자 하는 의지를 지닌체 출발했지만
곧 지나지 않아 택도 없다는 사실을 깨닿고 계속 확장되여졌습니다.
어쩃든 아스키코드는 한글을 담지 않고 있는 반면 유니코드는 한글뿐 아니라
극동아시아(korea, china, japan -실제로는 CJK라고 불리는 ㅠ.ㅠ)의 한자들도
모두 이 레파토리에 담기로 했습니다.

두번째로 인코딩하는 방법입니다. 이것은 나중에 설명하겠습니다

세번째로 매치되는 코드입니다. 말하자면 가 에 0xff034라는 코드를 부여합니다.
이런식으로 모든 캐릭터 레파토리에 중복되지 않은 코드(숫자)를 부여합니다.
실제 코드부여는 10만개정도까지 이루어 졌다고 합니다.
실제로 plane이라는 개념을 이용하여 글자를 매치시키는데
현재 계속 확장되어 17플레인 약 110만개정도까지 담을 수 있습니다
한글 고어들도 잘하면 넣을 수 있겠죠?

흔히 사람들이 헷깔리게 되는것이 바로 두번째 인코딩하는 방법입니다.
인코딩의 종류에는 크게 UTF와 UCS가 있습니다. 두개는 서로 대응되는 인코딩이 있습니다만
약간식 다릅니다 ex) utf-16과 UCS2

이제 한번 인코딩을 설명해 보겠습니다. 크게 사람들이 사용하는 인코딩은 위키디피아를 참조하면

UTF-7 — a relatively unpopular 7-bit encoding, suited for transmission and storage only; it is often considered obsolete
UTF-8 — an 8-bit, variable-width encoding, compatible with ASCII.
UCS-2 — a 16-bit, fixed-width encoding that only supports the BMP
UTF-16 — a 16-bit, variable-width encoding that supports the full Unicode character mapping
UCS-4 and UTF-32 — functionally identical 32-bit fixed-width encodings
UTF-EBCDIC — an encoding intended for EBCDIC based mainframe systems

위와 같습니다.
uft-7은 이미 obsolete 되었습니다.
가장 많이 쓰는것은 UTF-8, UCS-2, UTF-16, UCS4 or UTF-32입니다

utf-8과 utf-16의 설명을 보면 variable-width라고 되어있습니다. 이말은
엔코딩시 같은 코드라도 쩌기 뒤쪽에 있는 코드들은 2바이트로 바뀔수 있다는 말입니다.
즉 예를 들어 대문자 A는 1바이트로 엔코딩이 되나 가는 2바이트 혹은 3바이트까지 늘어나는
가변바이트의 엔코딩입니다.

일견 변태적인 인코딩이라 할 수 있는 이 utf-8이 인기가 있는것은 이것이 ascii베이스로 만들어 졌기때문입니다
ascii베이스란 ascii글자들은 무조건 1바이트로 만드는 것이죠 그래서 지금까지 ascii로 만들어진
모든 문건들은 uft-8으로 읽어드릴때 별도의 변환이 필요없는 것입니다. 다시 말하면 utf-8으로 영문으로
된 글을 작성을 해도 ascii리더리로 문제없이 읽어지고 그 반대도 가능한 소위 말하는 하위 호환성이
성립이 됩니다.
그래서 거의 대부분의 사용자단의 유니코드 문서들은 utf-8이죠... 영어는 한마디로 ....... 캐사기

두번째로 많이 쓰이는건 UTF-16 혹은 UCS-2입니다
UTF-16과 UCS-2는 거의 대부분의 문자를 2바이트로 바꾸어 놓습니다.
아주 reasonable하죠 2바이트는 6만 5천개정도 되는데 아까 이야기한 코드가 부여된 10만개의
글자중 60퍼센트를 커버할 수 있는 양입니다. 이것은 프로그래밍을 용이하게 하고
말하자면 평등한 문자체계입니다. 영어로 쓰여진 문건도 UCS2로 저장이 된다면 도 아스키 리더기에서도
읽기가 불가능합니다. 심정적으로는 UCS2가 참 쓰고 싶죠
VS에서 wchar_t 즉 와이드 문자열을 쓴다면 UCS2(리틀 엔디안) 엔코딩을 쓴다고 생각하시면 됩니다.
마이크로소프트가 밀고있다고 생각하시면 됩니다. win32api들은 char * 를 받는 함수들도 내부적으로
char -> wchar_t변환을 거친후 와이드 캐릭터 계열 함수를 불러오게 됩니다.

세번째로 쓰이는건 UCS4 혹은 uft-32입니다.
32비트기 떄문에 이건 머........... 태양계 내에서 쓰이는 글자(오반가요?)를 다 담을 수 있겠죠
42억개 정도 되니까요.. 한자가 아무리 많다더라도 1억개를 지가 차지할 수는 없겠죠
머 예전 갑골문자까지 코드가 부여될지도 모르겠습니다만 -_-;;
어쩄뜬 이것은 데이터의 낭비라고도 할수 있는데 6만 오천개를 쓰기엔 조금 작고 하니
어쩔 수 없이 이걸 쓰는 것입니다. 리눅스계열에서 쓰는 glibc라이브러리 계열은 모두 내부적으로
UCS4를 쓴다고 알고 있습니다. 즉 gcc에서 wchar_t는 ucs4포맷입니다.
서로 달라요....

이제 프로그래밍 이야기로 들어가 볼까요? (이전까지는 도대체 무슨 내용이었단 말인가!!!)
우선 char *로 유니코드를 가르키지 못한다는것은 거짓말입니다
uft-8등 variable width로 엔코딩 되는 유니코드들은 char *밖에 방법이 없어요
게다가 char *는 모든 데이터 타입을 (캐스팅을 해서라도) 가르킬 수 있는 유일한 타입이기에
UTF-16등 기타 엔코딩도 모두 다 다룰수 있습니다. 단!!! 널문자등은 못쓰고
자신의 함수를 만들어야 합니다.

그리고 이런 문제가 되는것은 이종 플랫폼간의 데이터 교환입니다. 간단히 이야기해서 웹에서부터
(웹은 utf-8이 대세로 이미 굳어진듯한.. 아닌가요? 웹은 잘 몰라서)
*nix계열 게임서버와 windows클라이언트간의 유니코드 일치문제등 복잡한 이야기 들이 많습니다.

유니코드가 그리 쉬운 개념은 아니랍니다.
이번 글을 통해 유니코드가 어떤것이다라는 감을 잡으셨으면 좋겠구요

저도 말씀드렸다싶이 초보이기때문에 틀릴 수 있습니ㅏㄷ
위에것 100프로 믿지 마세요..
하두 유니코드라는게 이해안갈떄가 많아 찾아봐서 알게된 이야기들입니다.
그럼 나중에 또...


덧글|신고