프로그래밍 학습
//iconv 사용예
#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
iconv_t to_ucs4;
iconv_t to_utf16;
void dump(unsigned int ucs4, unsigned char *utf16, unsigned char *ucs4_be)
{
int i;
printf("UCS-4: %0x -> UTF-16BE: ", ucs4);
for(i=0;i<4;i++)
{
printf("\x%02x",utf16[i]);
}
printf(" -> UCS-4BE: U+");
for(i=1;i<4;i++)
{
printf("%02x",ucs4_be[i]);
}
printf("n");
}
int check(unsigned int ucs4)
{
char utf16[8];
char *utf16p = utf16;
char *ucs4p = (char *)&ucs4;
char ucs4_2[8];
char *ucs4_2p = ucs4_2;
size_t inbytesleft = 4;
size_t outbytesleft = 8;
size_t ret;
memset(ucs4_2,0,8);
ret = iconv(to_utf16,
&ucs4p,&inbytesleft,
&utf16p,&outbytesleft);
if(ret == (size_t)-1)
{
puts("error");
return 1;
}
inbytesleft = 4;
outbytesleft = 8;
utf16p = utf16;
ret = iconv(to_ucs4,
&utf16p,&inbytesleft,
&ucs4_2p,&outbytesleft);
if(ret == (size_t)-1)
{
dump(ucs4,utf16,ucs4_2);
return 1;
}
{
int i;
ucs4p = (char *)&ucs4;
for(i=0;i<4;i++)
{
if (ucs4p[i] != ucs4_2[i])
{
dump(ucs4,utf16,ucs4_2);
return 1;
}
}
}
return 0;
}
void init()
{
to_ucs4 = iconv_open("UCS-4LE","UTF-16BE");
if(to_ucs4 == (iconv_t)-1)
{
perror("init");
exit(1);
}
to_utf16 = iconv_open("UTF-16BE","UCS-4LE");
if(to_utf16 == (iconv_t)-1)
{
iconv_close(to_ucs4);
perror("init");
exit(1);
}
}
int main(void)
{
unsigned int ucs4;
init();
for(ucs4=0x10000;ucs4<=0x10FFFF;ucs4++)
{
if(check(ucs4) == 0)
{
printf("UCS-4: U+%0x: successn", ucs4);
}
}
iconv_close(to_ucs4);
iconv_close(to_utf16);
return 0;
}

