그제부터 갑자기 완성형, 유니코드 변환 코드를 만들어 보고 싶어졌다. 완성형, 유니코드 변환은 달리 방법이 없이 표를 가지고 변환해야 한다. http://www.unicode.org/Public/MAPPINGS/OBSOLETE/
EASTASIA/KSC/KSC5601.TXT 에서 확장완셩형(CP949)와 유니코드 변환 데이터를 얻을 수 있다. 만들어 보았는데, 생각외로 까다로웠다. unsigend int 를 사용해서 테이블을 표시했는데, 타입캐스팅 때문에 애를 조금 먹었다. unsiged char 를 조금 활용하면 해결 할 수 있다. 조금 보완해서 올리고 싶은데, 블로그에 파일이 안 올라가 공개하기 힘들것 같다.
그대신 오늘 만든 UCS 에서 UTF-8 변환 코드를 올릴려고 한다. http://ko.wikipedia.org/wiki/UTF-8 를 참조해서 머리를 쥐어 짜가며 만들었다. 테스트 해보지 못해 분명히 버그가 있을것 같다. 그리고 글자 하나만을 변경하기 때문에 별 의미가 없을 것 같다. 또한 UTF-8 에서 UCS 변환은 또다른 정보가 필요하기 때문에 조금 더 수정해야 한다. 누군가가 여기에서 버그를 발견한다면 이 블로그에 덧글을 달아주길 바란다. 그리고 여기서 말한 UCS 는 0x10FFFF 까지의 유니코드 자체를 말한다.
int ucs_utf8(unsigned int ucs, int * len)
{
int utf8=0;
if(ucs <= 0x7F)
{
*len = 1;
return ucs;
}
else if(ucs <= 0x07FF)
{
*len=2;
utf8 = 0xC080;
utf8 |= (ucs & 0x01F0) << 2;
utf8 |= (ucs & 0x000F) ;
return utf8;
}
else if(ucs <= 0xFFFF)
{
*len=3;
utf8 = 0xE08080;
utf8 |= (ucs & 0xF000) << 4;
utf8 |= (ucs & 0x0FC0) << 2;
utf8 |= (ucs & 0x003F) ;
return utf8;
}
else if(ucs <= 0x10FFFF)
{
*len=4;
utf8 = 0xF0808080;
utf8 |= (ucs & 0x01C000) << 6;
utf8 |= (ucs & 0x003000) << 4;
utf8 |= (ucs & 0x000FC0) << 2;
utf8 |= (ucs & 0x00003F) ;
}
else
{
*len = 0;
return 0;
}
}
unsigned short utf8_ucs(unsigned int utf8, int len)
{
unsigned short ucs=0;
if(len==1)
{
return utf8;
}
else if(len==2)
{
ucs |= (utf8 & 0x1F00) >> 2;
ucs |= (utf8 & 0x003F);
return ucs;
}
else if(len==3)
{
ucs |= (utf8 & 0x0F0000) >>4;
ucs |= (utf8 & 0x003F00) >>2;
ucs |= (utf8 & 0x00003F);
}
else
{
ucs |= (utf8 & 0x03000000) >> 6;
ucs |= (utf8 & 0x003F0000) >> 4;
ucs |= (utf8 & 0x00003F00) >> 2;
ucs |= (utf8 & 0x0000003F);
}
return 0;
}
EASTASIA/KSC/KSC5601.TXT 에서 확장완셩형(CP949)와 유니코드 변환 데이터를 얻을 수 있다. 만들어 보았는데, 생각외로 까다로웠다. unsigend int 를 사용해서 테이블을 표시했는데, 타입캐스팅 때문에 애를 조금 먹었다. unsiged char 를 조금 활용하면 해결 할 수 있다. 조금 보완해서 올리고 싶은데, 블로그에 파일이 안 올라가 공개하기 힘들것 같다.
그대신 오늘 만든 UCS 에서 UTF-8 변환 코드를 올릴려고 한다. http://ko.wikipedia.org/wiki/UTF-8 를 참조해서 머리를 쥐어 짜가며 만들었다. 테스트 해보지 못해 분명히 버그가 있을것 같다. 그리고 글자 하나만을 변경하기 때문에 별 의미가 없을 것 같다. 또한 UTF-8 에서 UCS 변환은 또다른 정보가 필요하기 때문에 조금 더 수정해야 한다. 누군가가 여기에서 버그를 발견한다면 이 블로그에 덧글을 달아주길 바란다. 그리고 여기서 말한 UCS 는 0x10FFFF 까지의 유니코드 자체를 말한다.
int ucs_utf8(unsigned int ucs, int * len)
{
int utf8=0;
if(ucs <= 0x7F)
{
*len = 1;
return ucs;
}
else if(ucs <= 0x07FF)
{
*len=2;
utf8 = 0xC080;
utf8 |= (ucs & 0x01F0) << 2;
utf8 |= (ucs & 0x000F) ;
return utf8;
}
else if(ucs <= 0xFFFF)
{
*len=3;
utf8 = 0xE08080;
utf8 |= (ucs & 0xF000) << 4;
utf8 |= (ucs & 0x0FC0) << 2;
utf8 |= (ucs & 0x003F) ;
return utf8;
}
else if(ucs <= 0x10FFFF)
{
*len=4;
utf8 = 0xF0808080;
utf8 |= (ucs & 0x01C000) << 6;
utf8 |= (ucs & 0x003000) << 4;
utf8 |= (ucs & 0x000FC0) << 2;
utf8 |= (ucs & 0x00003F) ;
}
else
{
*len = 0;
return 0;
}
}
unsigned short utf8_ucs(unsigned int utf8, int len)
{
unsigned short ucs=0;
if(len==1)
{
return utf8;
}
else if(len==2)
{
ucs |= (utf8 & 0x1F00) >> 2;
ucs |= (utf8 & 0x003F);
return ucs;
}
else if(len==3)
{
ucs |= (utf8 & 0x0F0000) >>4;
ucs |= (utf8 & 0x003F00) >>2;
ucs |= (utf8 & 0x00003F);
}
else
{
ucs |= (utf8 & 0x03000000) >> 6;
ucs |= (utf8 & 0x003F0000) >> 4;
ucs |= (utf8 & 0x00003F00) >> 2;
ucs |= (utf8 & 0x0000003F);
}
return 0;
}