http://cafe.naver.com/q69/99191

//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;
}