일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 | 31 |
- 패턴 인식
- 물걸레자동세척로봇청소기
- 멤버십
- 파이썬
- 증강현실
- 삼성소프트웨어멤버십
- 삼성전자 소프트웨어멤버십 SSM
- SSM
- 구글 앱 엔진
- Python
- 고려대학교
- 인공지능
- Friendship
- 빅데이터
- BAM
- Google App Engine
- 삼성
- 가상화
- Neural Network
- NarwalFreo
- 나르왈프레오
- 갤럭시탭S8울트라
- hopfield network
- 신경회로망
- 신경망
- Bidirectional Associative Memory
- 패턴인식
- 동아리
- 물걸레로봇청소기추천
- 하이퍼바이저
- Today
- Total
정보공간_1
[4기 신촌 백재현] 유니코드의 이해 본문
안녕하세요 신촌 멤버십 22-1기 백재현입니다.
이번에는 유니코드에 대해서 알아보도록 하겠습니다.
유니코드 라는 말은 많이 들어 보셨으리라 생각합니다. 하지만 유니코드가 정확히 무엇일까요?
더불어, UTF-8, UTF-16 같은 것은 무엇일까요? 대부분의 사람들은 UTF-8을 쓰니 유니코드가 완비되었다고 생각하는 경우가 많습니다. 이번 글을 모두 읽으시면 유니코드에 대해 어느정도 이해 하실 수 있으리라 생각됩니다.
세상에는 다양한 언어가 있고, 컴퓨터에서 언어를 표현하는 방법에는 수십 수백가지가 있습니다. UTF, 유니코드, 아스키코드, SAP, IBM 코드 페이지, MS 코드 페이지, 유니코드 등 이 세상 언어의 갯수보다 많은 방법이 존재합니다. '유니코드'로 인하여 이들이 하나의 동일한 규약으로 합쳐지기 전에는 수 많은 캐릭터 인코딩 방식이 존재했으며, 방금 언급했듯이 유니코드를 통하여 모든 언어에 대한 천하통일을 이룩하게 됩니다.
1991년 10월 "이 세상의 모든 문자를 담자"는 취지에서 만들어진 문자 부호 체계인 유니코드는 UCS2, UCS4의 두가지 종류가 있습니다.
UCS2 : 일반적으로 사용하는 언어들을 포함하는 셋입니다. 모두 2byte로 표현됩니다.
UCS4 : 산스크리트어, 옛 이집트 고어 등등까지 포함합니다.
아래는 유니코드가 표현하는 언어들에 대한 구성도입니다. 이를 BMP(Basic Multilingual Plane)이라 합니다.
U+0000의 ASCII부터 시작하여 U+FFFF까지 마련 되어 있습니다.
이는 각 언어들이 어느 영역에 있는지 표시합니다. 한글의 경우 AC근처 부터 D7까지 수 많은 범위를 통하여 표현됩니다. 위의 Plane은 2바이트 까지의 UCS-2 영역이며, ISO 10646이 정의했습니다. 각 글자들을 0~65535(0xFFFF)에 매겨서 BMP 영역이 표현 가능합니다.
예를 들어 BMP에서 '각'이라는 글자를 찾을려면 위의 표를 참조하여 U+AC01에 대응 되는 것을 알 수 있으며, 나중에 다시 설명하겠지만 이는 UTF-16으로 0xAC01로 표현 가능합니다. 이진수 10101100 00000001 로도 표현 가능합니다.
이제 이러한 유니코드를 표현하는 인코딩 방법에 대해서 알아보도록 하겠습니다. 흔히들 들어본 세가지 인코딩 방법이 있습니다. UTF-8, UTF-16, UTF-32가 그것입니다.
UTF-8 : 1~3byte를 사용하여 BMP를 모두 표현 가능
UTF-16 : 2byte를 사용하여 BMP를 모두 표현가능
UTF-32 : 4byte를 사용하여 BMP + 그 외의 영역을 표현 가능
크기만 보더라도 UTF-16 인코딩의 경우 BMP와 영역이 그대로 일치함을 예상할 수 있고, 실제로도 그렇습니다. U+A0A0영역이 있다면 UTF-16 인코딩을 사용할 경우 실제로 0xA0A0에 매칭됩니다.
BMP 외의 영역(USC-4영역) 잘 사용되지 않고, 크게 중요하지 않으므로 이번 글에선 넘어가도록 하겠습니다.
이제 각 UTF 인코딩에 대해 상세히 알아보도록 하겠습니다.
UTF-8
1바이트로 표시된 문자의 최상의 비트는 항상 0입니다. 예를 들어 01111111 이 있다면, UTF-8에서는 최상위 비트 1을 읽고 이를 1바이트의 UTF-8로 인코딩 해야 합니다.
2바이트 이상으로 표시된 문자의 경우, 첫 바이트의 상위 비트들이 그 문자를 표시하는데 필요한 바이트 수를 결정합니다. 2바이트로 구성된 경우 첫 바이트의 상위 비트는 110으로 시작하고, 3바이트로 구성되는 경우 첫 바이트의 상위 비트가 1110으로 시작합니다.
첫바이트가 아닌 나머지 바이트들은 상위 2비트가 항상 10입니다.
예를 들어 보면
00001111 : 앞의 0을 보고 1바이트임을 알 수 있다.
11011010 10100101 : 앞의 110을 보고 2바이트임을 알 수 있다.
11101010 10001010 10110010 : 앞의 1110을 보고 3바이트 임을 알 수 있다.
이런식으로 결정되며, 이후 인코딩 규칙들은 다음(클릭)을 참조하시기 바랍니다.
그냥 모든 문자를 2바이트로 표현하면 편할텐데 왜 굳이 귀찮게 UTF-8을 만들었는지 궁금하실 것이라 생각됩니다.
이유는 ASCII 인코딩 때문입니다. 유니코드가 나오기 이전 대부분의 인코딩은 ASCII로 이루어 졌는데, 이는 1바이트로 표현되어, 만약 ASCII로 표현된 문자를 UTF-16으로 디코딩 하려고하면 해석에 오류가 생길 것이 뻔했습니다. 이에 따라 UTF-8이 사용되게 되었고, UTF-8 중 한 바이트로 구성된 인코딩 규칙의 경우 ASCII와 동일하게 사용됩니다. 따라서 기존 ASCII로 구현된 시스템을 UTF-8로 인코딩/디코딩 하여 사용하는데 전혀 문제가 없습니다.
UTF-16
유니코드에서 지원하는 BMP를 그대로, 1:1로 매핑하여 사용되는 인코딩이며 2바이트로 표현됩니다.
UTF-32
BMP외의 다른 영역도 지원하기 위해 사용되는 인코딩으로 4바이트로 표현됩니다.
마무리
이제 유니코드가 무엇이고, UTF-8, 16, 32가 어떻게 사용되고 어떻게 다른지 충분히 이해하셨으리라 봅니다.
혹시 보충 설명을 원하시는 분이 계실 것 같아서 제가 예전에 진행했던 세미나 관련 PPT를 첨부하겠으니 참고하시기 바랍니다.
다들 좋은 하루 보내세요 :)
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[4기 신촌 박영웅] Android Application Stealth Update (3) (0) | 2013.12.05 |
---|---|
[4기 강남 노진우] 인간의 선택적 주의 (0) | 2013.12.05 |
[4기 신촌 백재현] Windows Device Driver의 Logo 인증 받는 절차 (0) | 2013.12.05 |
[4기 전주 김재호] 안드로이드 소프트웨어 키보드#5 - 조합 (0) | 2013.12.05 |
[4기 전주 김재호] 안드로이드 소프트웨어 키보드#4 - 이벤트 처리 (0) | 2013.12.05 |