[C++] 문자 표현
문자 표현
문자는 영문 알파벳뿐 아니라 한글 등 각국의 문자가 저장되어야 하므로 각 문자를 구분하기위한 방법이 있고, 다양한 인코딩 방식들이 있습니다.
다양한 문자를 표현하기 위해 각 문자별로 2진수의 코드 값을 부여한 코드 체계를 이용하며, 코드체계로는 아스키코드(ASCII: American Standard Code for information Interchange Code)와 유니코드(Unicode) 등이 있습니다.
아스키코드 (ASCII Code)
아스키코드는 7bit 부호체계(3개의 zone bit, 4개의 digit bit)로 구성되어 000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용됩니다.
33개의 출력 불가능한 제어 문자와 공백을 비록한 95개의 출력 가능한 문자로 128개의 문자가 있습니다.
3개의 zone bit는 영문자, 숫자, 특수문자를 구분하는 데 사용합니다. 제어문자들은 이제 대부분 사용되지 않습니다.
출력 가능한 문자는 52개의 대소문자 알파벳과 10개의 숫자, 1개의 공백문자, 32개의 특수문자로 구성됩니다.
7비트만 사용하는 이유는 나머지 1비트를 통신 에러 검출을 위해 사용했기 때문입니다.
패리티 비트(Parity Bit)라고 해서, 7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0로 하는 식의 패리티 비트를 붙여서 전송 도중 신호가 변질된 것을 수신측에서 검출해낼 확률을 높인 것입니다.
현재는 쓰이지 않으며 맨 앞 비트에 0을 붙이고 이어서 7비트가 사용되는 식의 인코딩이 일반적입니다.
아스키 코드에 의하면 대문자 ‘A’는 10진수로 65이고 저장공간에는 2진수로 01000001가 저장됩니다.
ANSI 코드
일반적으로 ANSI라고 하면 MS-DOS의 기본 인코딩인 OEM-US 내지는 영문판Windows의 기본 인코딩인 Windows-1252를 가리킵니다.
엄밀히 말해 ANSI는 틀린 표현이지만, 이렇게 통칭되고 있습니다.
다른 언어의 문자들을 표현하지 못하는 ASCII의 단점을 보완하기 위해 등장한 문자열 인코딩 방식입니다.
8bit로 문자를 표현합니다. 앞의 7bit는 문자를 표현하고, 뒤 1bit는 코드 페이지(CodePage)를 사용합니다.
코드 페이지(CodePage)는 특정 언어를 가리키는 코드 표입니다. 이 표는 특정 언어를 위해 코드값이 정해진 코드표입니다.
EUC-KR
문자열 표 아스키코드에는 숫자나 알파벳만 들어있었기 때문에 한글과 같은 다른 문자 체계는 표현이 불가능했습니다.
그래서 나라들마다 문자열 표를 만들었고, 이때 탄생한 문자열 셋이 EUC-KR입니다.
ANSI를 한글에 맞게 확장한 것입니다.
유닉스 계열에서 등장한 완성형 인코딩 방식으로 2byte를 사용해 하나의 문자를 표현합니다.
완성형 인코딩이란 완성된 각 문자에 코드를 부여하는 방식을 말합니다.
예를 들자면 가
, 각
등 초성, 중성, 종성이 따로 있지 않고 완성된 문자를 말합니다.
아래의 이미지는 EUC-KR 문자열 표입니다.
한글 가
는 b0 a 1
로 대응됩니다.
코드표에는 위와같은 한글뿐만이 아니라 특수 기호, 영어, 한문, 일어 등이 함께 정의되어 있습니다.
EUC-KR도 문제가 있습니다.
나라마다 문자열 셋을 다 따로 만들게 된다면 인코딩이 통일되지 않아 문자가 깨지는 현상이 자주 발생할 수 있습니다.
즉 다른 나라에서는 호환되지 않을 가능성이 있습니다.
예로 EUC-KR에 정의되어있지 않은 언어를 동시에 표현할 수 없는 문제도 발생 할 수 있습니다.
이 문제를 해결하기 위한 방법으로 나온게 유니코드입니다.
또 다른 문제로 모든 한글 단어를 표현하기에는 부족합니다.
한글을 2,350자를 지원하는데 모든 한글을 표현하기에는 부족한 수라 이를 보완한 CP949가 있습니다.
CP949
마이크로소프트에서 윈도우즈 계열에서 한글 지원을 위해 나온 확장 완성형 인코딩 방식입니다.
949는 한국에 대응하는 코드 페이지 번호를 의미합니다.
마이크로소프트에서 만들었기 때문에 MS949라고도 부릅니다.
EUC-KR이 많은 한글 단어를 표현하지 못한 문제를 보완하기 위해 만들어졌습니다.
똑같이 2byte로 하나의 문자를 표현하지만, EUC-KR에서 사용하지 않은 나머지 바이트열을 활용해 대부분의 한글 단어를 표현할 수 있도록 개선되고 확장된 인코딩 방식입니다.
EUC-KR과는 호환이 되지만 EUC-KR은 단어들을 사전순으로 배열하였고, CP949는 사전순으로 배열하지 않아 문제점이 존재합니다.
EUC-KR에서 CP949로 인코딩은 문제가 없지만 CP949에서 EUC-KR로 인코딩은 표현할 수 있는 글자의 수 등 문제점이 있어 모든 글자를 표현 할 수 없습니다.
윈도우 메모장에서 인코딩 방식을 ANSI로 선택하고 저장하면 단순히 ANSI가 아닌 CP949 방식으로 인코딩 됩니다.
유니코드(UniCode)
전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있는 표준 문자 코드표로 컴퓨터간 문자 데이터 교환을 원활하게 하기 위해 유니코드 협회가 제정하였습니다.
문자를 표현하기 위해서 16bit를 할당하여 65,536개의 문자를 표현할 수 있는 문자 집합으로 아스키코드를 포함합니다. 아스키코드를 유니코드로 표현할 때는 0000 0000을 붙입니다. 아스키코드는 U+0000 ~ U+007F 영역에 매핑됩니다. 각 문자 집합을 영역 또는 블록이라 하고 각 영역 또는 블록 내의 각 문자는 코드 포인트(Code Point)가 매핑되며 한 코드 영역은 다른 코드 영역과 겹치지 않습니다. 영역의 크기는 16의 배수이고 각 영역은 16의 배수(U+nnnn)의 코드 포인트로 시작됩니다.
기본 다국어 평면(BPM, Basic Multilingual Plane)을 포함하여 16개의 평면으로 구성되면 기본 다국어 평면은 65,536개의 코드 포인터를 가지고 있으며 한글도 이 평면에 매핑됩니다. 한글은 U+AC00 ~ U+D7AF 영역에 매핑됩니다.
유니코드의 인코딩 방식으로 UTF(Universal Transformation Format)-8, UTF-16 UTF-32 등이 있습니다.
UTF-8
UTF-8 코딩 방식은 가변 길이 문자 인코딩 방식(멀티바이트) 이며, ANSI의 단점을 보완하기 위해 만들어졌습니다. ANSI는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야 하지만, UTF-8은 멀티바이트 개념을 사용해 하나의 Character Set에 거의 모든 문자를 넣었습니다.
멀티바이트란 표현해야하는 문자에 따라 글자 크기를 가변으로 변경하여 사용하는 것을 말합니다. ANSI는 고정바이트(1byte) 형태로 최대 256자까지만 표현이 가능하나 UTF-8은(1~4byte)1,112,064자까지 표현이 가능합니다.
첫 128자는 기존 ASCII 코드 값으로 ANSI와 동일합니다. 그래서 영어를 사용할 경우 1byte만 사용합니다.
2byte는 중동지역, 많은 유럽 언어가 사용하며, 3byte이상은 한국, 중국, 일본 등 동아시아권 언어가 사용합니다.
UTF-16
문자가 2byte씩 할당되는 UTF-8의 변형이라고 보면 됩니다.
가변 길이 문자 인코딩 방식을 가지며, 자주 사용하는 문자는 2byte, 그렇지 않은 문자는 4byte로 표현합니다.
한글의 경우 UTF-8로 저장할 경우 3byte가 필요하지만 16에선 2byte면 돼 용량의 이점이 있습니다. 그러나 경우에 따라 2byte 이상을 사용할 경우가 있어 용량의 이점이 크다보기 어렵습니다.
Byte Ordering을 고려함에 따라 복잡성 증대와 ANSI와 호환이 안 되는 단점이 있습니다.
Byte Ordering은 데이터가 저장되는 순서로, Rettle Endian과 BigEndian 방식이 있습니다.
UTF-32
모든 문자를 4byte로 고정하는 인코딩을합니다.
유니코드 코드 포인트가 직접 인덱싱 된다는 장점을 가지고 있습니다.
일련의 코드 포인트에서 N번째 코드를 찾은 것은 상수 시간 작업이지만 가변 길이 코드(UTF-8,UTF-16가 해당)는 문자열 시작부터 N 코드 포인트를 계산하기 위해 선형 시간이 필요해 상대적으로 처리과정이 간단하며, 빠른 속도를 가집니다.
단점으로는 UTF-16의 두 배에 가까워 매우 비효율적인 메모리를 사용하므로 많은 저장 공간을 사용해 자주 사용되지 않습니다.
또한 Byte Ordering을 고려해야 합니다.
참조
http://helloworld.naver.com/helloworld/textyle/19187
댓글남기기