[출처 : http://blog.naver.com/nlp1/150079485722]


 한글

 구분  시작  끝
 한글(자음, 모음)  1100  11FF
 호환용 한글(자음, 모음)  3131  318F
 한글 음절(가~힣)  AC00  D7A3

 

한자

 구분  시작  끝
 한중일 부수 보충  2E80  2EFF
 한중일 통합 한자 확장 - A  3400  4DBF
 한중일 통합 한자  4E00  9FBF
 한중일 호환용 한자  F900  FAFF
 한중일 통합 한자 확장  20000  2A6DF
 한중일 호환용 한자 보충  2F800  2FA1F

 

일어

 구분  시작  끝
 하라가나  3040  309F
 가타카나  30A0  30FF
 가타카나 음성 확장  31F0  31FF
[출처 : http://wiki.kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP-7.html]


무엇보다 먼저 UCS와 유니코드는 단지 정수를 문자에 할당하는 코드 테이블일 뿐이 라는 것이다. 그러한 문자 혹은 문자 각각의 정수 값의 시퀀스가 어떻게 바이트 시퀀스로 나타날 수 있는 지에 대한 몇 가지 대안들이 존재한다. 대단히 이해하기 쉬운 두 개의 인코딩은 유니코드 텍스트를 2 혹은 4바이트 시퀀스의 시퀀스(sequences of eit her 2 or 4 bytes sequences)로써 저장한다. 이러한 용어에 관한 공식적인 명칭은 각 각 UCS-2와 UCS-4이다. 다른 방법으로 명시되지 않는다면, 가장 중요한 바이트가 이들의 첫번째로 온다(Bigendian convention). ASCII 또는 Latin-1 파일은 모든 ASCII 바이트의 앞에 0x00 바이트를 삽입하므로써, UCS-2 파일로 변환시킬 수 있다. UCS-4 파일을 원한다면, 모든 ASCII 바이트 앞에 그 대신에 세개의 0x00 바이트를 삽입해야만 한다.

유닉스 환경에서 UCS-2(또는 UCS-4)를 사용하는 것은 매우 심각한 문제점을 불러온 다. 이러한 인코딩을 가진 문자열들은 파일명과 C 라이브러리 함수 파라미터에서 특별 한 의미를 갖는 '\0' 혹은 '/'와 같이 매우 광범위한 문자 바이트를 부분적으로 포함할 수 있다. 이에 더해, 대다수의 유닉스 툴들은 ASCII 파일을 예상하며, 큰 수정이 없이는 16비트 단어들을 문자로 읽을 수 없다. 이러한 이유 때문에 UCS-2는 파일명과 텍스트 파일 및 환경 변수 등에 적합한 유니코드의 외부 인코딩(suitable external encoding of Unicode)이 아니다.

ISO 10646-1 의 Annex R과 RFC 2279상에 정의된 UTF-8 인코딩은 이러한 문제점들이 없다. 이것은 유닉스 스타일의 운영 체제하에서 유니코드를 사용하기 위한 의심할 여지없이 좋은 방법이다.

UTF-8은 다음의 성질을 갖고 있다:

  • U+0000부터 U+007F까지의 UCS 문자들은 0x00에서 0x7f 바이트까지 쉽게 인코딩된다(ASCII와의 호환성). 이것은 오직 7비트의 ASCII 문자들을 포함하는 파일 및 문자열들이 ASCII와 UTF-8 양쪽 모두에서 같은 인코딩을 갖는다는 것을 의미한다.
  • U+007F보다 큰 모든 UCS 문자들은 각각 독자적인 바이트의 시퀀스로써 인코딩되며, 이것들은 각각 가장 중요한 비트셋(bit set)을 가진다. 그러므로 다른 문자의 부분에 어떤 ASCII 바이트(0x00-0x7f)도 나타날 수 없다.
  • ASCII가 아닌 문자를 나타내는 멀티바이트 시퀀스의 첫번째 바이트는 항상 0xC0에서부터 0xFD 범위에 있으며, 그것은 이러한 문자를 위해 얼마나 많은 바이트가 필요한 지를 가르킨다. 멀티바이트 시퀀스의 모든 이후의 바이트들은 0x80에서부터 0xBF 범위에 있다. 이 때문에 resynchronization을 쉽게할 수 있고 국가에 구애받지 않고 인코딩할 수 있으며 바이트를 잃어버리지 않게 된다.
  • 가능한 모든 231 UCS 코드를 인코딩할 수 있다.
  • UTF-8로 인코딩한 문자들은 이론적으로 6바이트 길이까지 가능하지만, 16비트 BMP 영역 문자들은 오직 3바이트 길이까지 가능하다.
  • Bigendian UCS-4 바이트 문자열의 정렬 순서는 보존된다.
  • 0xFE 및 0xFF 바이트는 결코 UTF-8 인코딩에서 사용하지 않는다.

다음의 바이트 시퀀스는 한 문자를 나타내기 위해 사용한다. 사용되는 시퀀스는 그 문자의 유니코드 번호에 따라 달라진다.


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

xxx비트의 위치는 이진 표기법에 의해 문자 코드 번호의 비트들로 채워진다. 오른쪽의 x비트는 별로 중요하지 않다. 그 문자의 코드 번호를 나타내는 오직 가장 짧은 멀티바이트 시퀀스만 사용할 수 있다. 멀티바이트 시퀀스에서 첫 번째 바이트의 왼쪽 1비트의 수는 전체 시퀀스에서의 바이트 수와 같다는 점에 주의하라.

예: "유니코드 문자 U+00A9 = 1010 1001"(저작권 부호)는 다음과 같은 UTF-8에 따라 인코딩된다.

11000010 10101001 = 0xC2 0xA9

그리고 문자 U+2260 = 0010 0010 0110 0000(저작권 부호)는 다음과 같은 UTF-8에 따라 인코딩된다.

11100010 10001001 10100000 = 0xE2 0x89 0xA0

이러한 인코딩의 공식 명칭과 정확한 표기는 UTF-8이며, UTF는 UCS Transformation Format을 의미한다. utf8혹은 UTF_8과 같은 다른 방법으로 UTF-8을 문서에 쓰지마라. 물론 인코딩 자체를 참조하지 않고 변수명에 참조할 경우에는괜찮다.

UTF-8의 디코딩 처리 순서에 있어서 중요한 점은 다음과 같다: 보안상의 이유 때문에, UTF-8 디코더는 한 문자를 인코딩하기 위해서 필요 이상으로 긴 UTF-8 시퀀스를 받아들여서는 안 된다. 예를 들어 U+000A(라인 피드) 문자는 오직 0x0A 형식으로 UTF-8 스트림으로부터 받아들여야만 하며, 다음의 다섯가지와 같이 과도하게 긴(overlong) 형식으로 받아들여서는 안된다.

  0xc0 0x8A
  0xe0 0x80 0x8A
  0xf0 0x80 0x80 0x8A
  0xf8 0x80 0x80 0x80 0x8A
  0xfc 0x80 0x80 0x80 0x80 0x8A

가장 짧은 인코딩을 찾기 위한 UTF-8 서브스트링 테스트를 무시하기 어떤 과도하게 긴 UTF-8 시퀀스를 남용할 수 있다. 모든 과도하게 긴 형식의 UTF-8 시퀀스는 다음의 바이트 패턴 중 한 가지로 시작한다.


1100000x (10xxxxxx)
11100000 100xxxxx (10xxxxxx)
11110000 1000xxxx (10xxxxxx 10xxxxxx)
11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx)
11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx)

정상적인 UTF-8 혹은 UCS-4 데이터상에서 코드 위치 U+FFFE와 U+FFFF 뿐만 아니라 코드 위치 U+D800 부터 U+DFFF(UTF-16 대용)까지는 사용해서는 안 된다. UTF-8 디코더는 이러한 것들을 안전성을 이유로, 잘못된 형식으로 혹은 너무 긴 시퀀스로 취급해야 만 한다.

Markus Kuhn의 UTF-8 decoder stress test file은 잘못된 형식을 갖는 과도하게 긴 UTF-8 시퀀스의 체계적인 모음을 포함하고 있으며 디코더의 강력함을 증명해준다.

[출처 : http://blog.naver.com/websearch?Redirect=Log&logNo=70093912364]


완성형의 한글 코드 영역은 다음과 같다. 완성형은 KSC5601 문자셋을 의미한다.

 

* 상위 바이트 : 0xBO ~ 0xC8

* 하위 바이트 : 0xA1 ~ 0xFE

 

확장 완성형의 한글 코드는 완성형의 한글 코드에 아래의 한글 코드 영역이 추가된다. 확장 완성형은 MS CP949 를 의미한다. 중간 중간 빈 공간을 채워 넣었기 때문에 아래의 코드 영역은 연속적이지 않다.

 

* 상위 바이트 : 0x81 ~ 0xC6

* 하위 바이트 : 0x41 ~ 0xFE

 

유니코드에서 한글 코드 영역은 다음과 같다.

 

* 0xAC00 ~ 0xD7A3

[출처 : http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html#utf8]


UTF-8

가장 완벽하게 유니코드 표준을 표현하는 인코딩 방식은 UTF-16이라고 할 수 있습니다. 그런데 이 인코딩에서는 16비트 단위로 하나의 문자가 표현되기 때문에 전통적인 char 형과는 맞지 않는 부분이 있습니다. UTF-16으로 문자열을 표현했을 때 전통적인 char 형으로 이 문자열 취급하게 되면 중간에 널(null, 0)값이 들어가게 되어 문제가 발생합니다. 즉 유니코드를 지원하려면, 지금까지 개발된 모든 프로그램을 재개발해야 한다는 부담이 발생합니다. 현실적으로 이것은 거의 불가능한 일이라고 할 수 있습니다.

이의 대안으로 제시된 인코딩이 바로 UTF8입니다. UTF-8은 문자열의 중간 바이트에서 0이 나타나지 않도록 고안되었습니다. 이를 위해 각 유니코드 문자는 1바이트에서 4바이트까지 가변적으로 인코딩되도록 하고 있습니다. UTF-8에서는 U+0000 ~ U+007F까지의 128자는 1바이트로 표현되는데 이는 ASCII와 동일합니다. 또 U+0080 ~ U+07FF까지는 두 바이트, U+0800 ~ U+FFFF까지는 세 바이트로 표현됩니다. 즉 BMP내의 모든 문자는 1 ~ 3바이트로 표현됩니다. 그리고 나머지 16개의 보충언어판에 위치하는 1,048,576개의 코드는 네 바이트로 인코딩됩니다. 다음 표에서 UCS-4와 UTF-8간의 변환 방법을 나타내고 있습니다.

표. UTF-8과 UCS-4간의 변환 규칙

UCS-4 UTF-8

위의 표에서는 UCS-4와 UTF-8간의 변환 규칙을 보여주고 있습니다만, UCS-4의 모든 영역에 대해서 보여주고 있습니다. 그러나 빨간색으로 칠한 부분을 0x0010FFFF로 변경하고 나머지는 삭제해야 정확한 유니코드의 UTF-8 인코딩이라고 할 수 있습니다. 이를 모두 표현한 것은 6바이트까지 확장하면 UTF-8로도 UCS-4의 전역을 인코딩할 수 있음을 보여주기 위한 것입니다. 아마도 1백만자의 코드이면 지구상에 존재했거나 존재하는 모든 문자를 표현하기에 충분할 것으로 예상됩니다. 우주의 모든 언어코드를 표현해야 할 때가 오면 0x00110000 이후의 영역도 사용할 가능성이 조금이나마 있을까요?

어쨌든, 현재 유니코드 표준에서는 UTF-8이 4바이트까지로 인코딩됩니다. 유니코드에 정의된 각 코드는 반드시 다음과 같은 범위에서 인코딩되어야 합니다. 다음 표는 UTF-8 인코딩에서 각 바이트에 올 수 있는 값을 보여주고 있습니다.

표. 올바른 UTF-8 바이트 배열

Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
U+0000 ~ U+007F
U+0080 ~ U+07FF
U+0800 ~ U+0FFF
U+1000 ~ U+CFFF
U+D000 ~ U+D7FF
U+D800 ~ U+DFFF
U+E000 ~ U+FFFF
U+10000 ~ U+3FFFF
U+40000 ~ U+FFFFF
U+100000 ~ U+10FFFF

+ Recent posts