Public/tip & tech

유니코드(uni) 를 utf8로 변환 (euc-kr <-> utf-8)

quantapia 2009. 5. 12. 17:55

우리나라의 많은 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;

 

 

######################################################################