UTF-8 코드에 대해서..
ISO646국제 표준은 UCS(Universal Character Set)를 정의하고 있다.
UCS는 모든 문자셋의 상위 표준이다.
ISO646은 공식적으로 31 bit 문자셋을 정의하고 있지만 처음에 문자셋은 65534(0x0000 ~ 0xFFFD)까지만 위치했다. 이 16 bit 영역을 BMP(Bagic Multilingual Plane)또는 "Plane 0"이라고 한다.
ISO646프로젝트와 유니코드 프로젝트로 단일 통합 문자셋을 만들려는 프로젝트가 진행되었다.
1991년 둘은 단일 코드테이블을 만들기위해 함께 작업을 했다.
Unicode 2.0 이후는 단일 코드테이블을 사용하고 있으며 맞지 않는 코드는 삭제되거나 rename 될 것이다.
문자셋에 정수형 시퀀스(Sequence)가 어떻게 나타날지 여러가지 대안이 있는데 그 중 하나가 UTF-8이다.
UTF-8의 성질
ⓐ U+0000 ~ U+007F 까지의 UCS문자들은 0x00 ~ 0x7F로 인코딩. 따라서 ascii문자와 동일.
ⓑ U+007F 보다 큰 UCS문자들은 독자적인 바이트 시퀀스로 인코딩.
ⓒ 멀티바이트 시퀀스의 첫번째 바이트는 항상 0xC0 ~ 0xFD 범위를 갖고, 이 문자를 위해 얼마나 많은 바이트가 필요한지를 나타낸다. 멀티바이트 시퀀스 이후 바이트는 0x80 ~ 0xBF 범위를 갖는다.
ⓓ 2^31 의 모든 UCS코드를 인코딩할 수 있다.
ⓔ UTF-8로 인코딩한 문자들은 6바이트 시퀀스까지 가능하나 16bit BMP(Bagic Multilingual Plane) 영역의 문자들은 3바이트까지만 가능하다.
ⓔ Big Endian UCS-4바이트 문자열의 정렬순서는 보존된다.
바이트별 범위
U-00000000 - U-0000007F : 0xxxxxxx
U-00000080 - U-000007FF : 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF : 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF : 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF : 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
예1) U+00A9 = 1010 1001
2번째 범위를 따르고, 위 범위에서 오른쪽부터 채우면 된다.
11000010 10101001 = 0xC2 0xA9
예2) U+2260 = 0010 0010 0110 0000
3번째 점위를 따른다.
11100010 10001001 10100000 = 0xE2 0x89 0xA0
UTF-8 디코딩 처리에서 중요한 점은 한 문자를 디코딩하기 위해서 필요이상으로 긴 UTF-8 시퀀스를 사용해서는 안된다.
예1) 0x0A "라인피드"의 경우 오직 0x0A로만 UTF-8 스트림을 받아들여야 한다.
다음과 같은 overlong 형식으로 받아들여서는 안된다.
0xC0 0x8A
0xE0 0x80 0x8A
인코딩 셋에 관련하여 :
UTF-8로 작성된 텍스트를 읽을때, cat 명령이나 echo 명령과 같이 단순 바이트 스트림만 처리하는 명령은 UTF-8이든 EUC-KR이든 인코딩셋을 완전히 무시하게 된다. 그런 명령들은 "\n"과 같은 제어문자만 인식하기때문에 인코딩셋이 어떤 것이든 상관이 없게된다. 허나 바이트를 읽어 문자수를 계산한다던가 euc-kr셋팅된 환경에서 vi를 이용하여 문서를 수정(바이트를 수정)할 경우는 문제가 된다.