'iconv'에 해당되는 글 1건

iconv 의 사용예제 소스입니다.

예전에는 libiconv.so 를 링크해야만 했던 시절이 있었으나
최근 glibc 에서는 iconv library 가 내장되어 좀 편리해졌습니다.

코드:
/*
  Copyright (C) Information Equipment co.,LTD
  All rights reserved.
  Code by JaeHyuk Cho <mailto:minzkn@infoeq.com>
  CVSTAG="$Id$"
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#include <iconv.h>

typedef unsigned short t_iconv_word;

t_iconv_word (do_iconv)(const char *s_charset, t_iconv_word s_wchar)
{
 iconv_t s_iconv;
 t_iconv_word s_buffer[ 16 ], s_code = (t_iconv_word)0x0020;
 s_iconv = iconv_open("UTF-16", s_charset);
 if(s_iconv != ((iconv_t)(-1)))
 {
  char *s_in, *s_out;
  size_t s_in_size, s_out_size, s_result_size;
  s_in = (char *)(&s_wchar);
  s_in_size = sizeof(s_wchar);
  s_out = (char *)(&s_buffer[0]);
  s_out_size = sizeof(s_buffer);
  s_result_size = iconv(s_iconv, (char **)(&s_in), (size_t *)(&s_in_size), (char **)(&s_out), (size_t *)(&s_out_size));
  if(s_result_size != ((size_t)(-1)))s_code = s_buffer[1];
  (void)iconv_close(s_iconv);
 }
 else (void)fprintf(stderr, "can not open iconv\n");
 return(s_code);
}

int (do_make_header)(const char *s_file_name, const char *s_symbol, t_iconv_word *s_map, size_t s_map_size)
{
 FILE *s_file;
 size_t s_offset, s_index;
 s_file = fopen(s_file_name, "wb");
 if(s_file != ((FILE *)0))
 {
  (void)fprintf(s_file, "const unsigned short %s[] = {\n", s_symbol);
  s_offset = (size_t)0;
  do
  {
   s_index = s_offset / sizeof(t_iconv_word);
   if((s_index % 16) == ((size_t)0))
   {
    if(s_index != ((size_t)0))(void)fprintf(s_file, "\n");
    (void)fprintf(s_file, " ");
   }
   (void)fprintf(s_file, "0x%04x", (unsigned int)s_map[s_index]);
   s_offset += sizeof(t_iconv_word);
   if(s_offset < s_map_size)(void)fprintf(s_file, ", ");
   else break;
  }while(1);
  (void)fprintf(s_file, "\n};\n");
  (void)fclose(s_file);
 }
 else (void)fprintf(stderr, "can not write \"%s\"\n", s_file_name);
 return(0);
}

int (main)(int s_argc, char **s_argv)
{
 t_iconv_word *s_map[3], s_wchar;
 size_t s_map_size, s_offset, s_index;
 s_map_size = sizeof(t_iconv_word) * (0x10000 >> 1);
 s_map[0] = (t_iconv_word *)malloc(s_map_size);
 s_map[1] = (t_iconv_word *)malloc(s_map_size);
 s_map[2] = (t_iconv_word *)malloc(s_map_size);
 if((s_map[0] != ((t_iconv_word *)0)) && (s_map[1] != ((t_iconv_word *)0)) && (s_map[2] != ((t_iconv_word *)0)))
 {
  s_offset = (size_t)0;
  s_wchar = (t_iconv_word)0x8000;
  while(s_offset < s_map_size)
  {
   s_index = s_offset / sizeof(t_iconv_word);
   s_map[0][s_index] = do_iconv("EUCKR", s_wchar);
   s_map[1][s_index] = do_iconv("EUCJP", s_wchar);
   s_map[2][s_index] = do_iconv("CP949", s_wchar);
   (void)fprintf(stdout,
    "conv 0x%04x -> euckr=0x%04x, eucjp=0x%04x, cp949=0x%04x\n",
    (unsigned int)s_wchar,
    (unsigned int)s_map[0][s_index], (unsigned int)s_map[1][s_index], (unsigned int)s_map[2][s_index]);
   s_wchar++;
   s_offset += sizeof(t_iconv_word);
  }
  (void)do_make_header("euckr_map.h", "c_mzapi_euckr_map", (t_iconv_word *)(&s_map[0][0]), s_map_size);
  (void)do_make_header("eucjp_map.h", "c_mzapi_eucjp_map", (t_iconv_word *)(&s_map[1][0]), s_map_size);
  (void)do_make_header("cp949_map.h", "c_mzapi_cp949_map", (t_iconv_word *)(&s_map[2][0]), s_map_size);
  free((void *)s_map[0]);
  free((void *)s_map[1]);
  free((void *)s_map[2]);
 }
 else (void)fprintf(stderr, "can not allocate memory\n");
 return(0);
}

/* vim: set expandtab: */
/* End of source */
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/174

댓글을 달아 주세요