우리나라의 많은 DB와 웹페이지들이 아직까지도 여전히euc.kr로 되어 있는곳을 볼수 있다.
그런데 나처럼 검색쪽 일을 하다보면 자연스럽게 euc-kr에서 utf-8로 변환해야할 필요성이 발생하게 된다.
다국어 처리와 같은 문제도 있겠지만 한국어 처림내에서도 euc-kr은 한계가 있기 때문에 euc.kr에서 utf-8로 변환과정은 불가피해 보인다.
아래는 UCS2 => UTF-8로 변환하는 과정이다.
입력 어절 가 => 0xAC00(UCS-2)
0xAC00 => 10101100 00000000
0xF000 11110000 00000000 &
----------------------------
10100000 00000000 >> 12
00000000 00001010
0XE0 00000000 11100000 |
----------------------------
00000000 11101010 => 0xEA
0xAC00 => 10101100 00000000
0x0FC0 00001111 11000000 &
----------------------------
00001100 00000000 >> 6
00000000 00110000
0XE0 00000000 11100000 |
----------------------------
00000000 10110000 => 0xB0
0xAC00 => 10101100 00000000
0x003F 00000000 00111111 &
----------------------------
00000000 00000000
0x80 00000000 10000000 |
----------------------------
00000000 10000000
0XE0 00000000 11100000 |
----------------------------
00000000 10000000 => 0x80
0xEA 0xB0 0x80
0xB0EA 0xFF80
#####################################################################
0 ~ 0x7F
일단 아스키와 동일한 영역은 그대로 써주면 되니까 skip
####################################################################
2바이트로 표시해야 하는 경우( 0x0081 ~ 0x07ff까지)
취대 범위가 0X07FF(111 11111111) 이기 때문에 상위 바이트의 3비트와 하위 바이트의 8비트값만을 변환시켜주면 된다. 총 11비트)
5비트 + 6비트 == 11비트
변환할려고 하는 글자를 가르키는 포인터 *ucs( unsigned short 형)
0xC0 (11000000)
0x07C0 ( 111 11000000 )
0x003F ( 111111 )
2바이트 캐릭터라는 표시를 위해 상위비트에 11(0xc0)을 세팅한다.
*p = *p | 0xc0
변환할려고 하는 글자의 첫번째 바이트2비트와 두번째 바이트 3비트를 포함하여 총 5비트만을 취한다
*p = *p | (( ucs & 0x07c0) >> 6)
변환할려고 하는 글자의 두번째 바아트의 6바이트만을 취한다
*p = *p | ((ucs & 0x003F)
#####################################################################
#####################################################################
3바이트로 표시해야 하는 경우( 0x8000부터 0xFFFF까지)
취대 범위가 0XFFFF(11111111 11111111) 이기 때문에 상위 바이트의 8비트와 하위 바이트의 8비트값을 변환시켜주면 된다. 총 16비트)
4비트 + 6비트 + 6비트 == 16비트
0XE0 ( 11100000 )
0xF000 ( 11110000 00000000)
0x0FC0 ( 111111000000 )
0x003F ( 111111 )
15비트에 대한 처리(첫번째 1비트는 2바이트 캐릭터에 대한 표시이므로 제외)
3바이트 캐릭터라는 표시를 위해 상위비트에 111(0xE)을 세팅한다.
*q = *q | 0xE0;
######################################################################