iconv 의 사용예제 소스입니다.
예전에는 libiconv.so 를 링크해야만 했던 시절이 있었으나
최근 glibc 에서는 iconv library 가 내장되어 좀 편리해졌습니다.
예전에는 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 */ |


mziconv.tar.bz2

댓글을 달아 주세요