레이블이 iconv인 게시물을 표시합니다. 모든 게시물 표시
레이블이 iconv인 게시물을 표시합니다. 모든 게시물 표시

iconv 기본 사용법

#윈도우용 iconv 를 사용하는 경우 아래 gnuwin32 에서 source, bin 등이 얻을 수 있다.
# 인코딩 변환시 많이 사용되는 툴(라이브러리)인 iconv 옵션
# -f 원 문서 인코딩
# -t 출력 인코딩
# -c 출력에서 잘못된 문자 제외
# -s 경고를 표시하지 않기
# -l 지원하는 인코딩(문자셋) 보기

# iconv 가 지원하는 인코딩 종류 보기
iconv -l

# 윈도우의 기본 한글 인코딩인 cp944(ms949) 을 utf-8 로 변경할 경우
iconv -f cp949 -t utf-8 file1.txt > file2.txt

C/C++ iconv euc-kr to utf-8

download iconv library ( http://www.gnu.org/software/libiconv/ )
tar -zxvf libiconv-1.12.tar.gz
cd libiconv-1.12
./configure --enable-FEATURE=yes --enable-static=yes --enable-shared=yes --enable-extra-encodings=yes
make

// iconv C 예제
#include <errno.h>
#include "iconv.h"

// UTF-8 로 인코딩하여 저장하기
// UTF-8 의 크기는 EUC-KR 의 약 3배 정도이다.
size_t szIn = strlen(pContents) + 10;
size_t szOut = szIn * 3;
char *pIn = new char[szIn];
char *pOut = new char[szOut];
memset(pIn, '\0', sizeof(char)*szIn);
memset(pOut, '\0', sizeof(char)*szOut);
strcpy(pIn, pContents);
char *pIn2 = pIn;
char *pOut2 = pOut;

iconv_t cd;
int ret;
// EUC-KR 을 UTF-8 로
// 변환될코드의 문자열에 "//IGNORE" 문자열을 추가하여 변환될수 없는 문자에 대해서는 무시하도록 한다.
if ( (cd = iconv_open("UTF-8//IGNORE", "EUC-KR")) < 0 )
{
    // iconv_open 에서 error 나면 errno 을 셋팅한다.
    fprintf(stderr, "Fail to iconv_open() errorno : %d\n", errno);
    exit(-1);
}
// 변환하기
if ( (ret = iconv(cd, &pIn2, &szIn, &pOut2, &szOut)) < 0 )
{
    // iconv 에서 error 나면 errno 을 셋팅한다.
    // E2BIG *outbuf에 공간이 부족합니다
    // EILSEQ 부정확한 다중바이트 문자열이 입력값으로 들어왔습니다.
    // EINVAL 완료되지않은 다중바이트문자열이 입력값으로 들어왔습니다.
    char errmsg[10] = "";
    if (errno == E2BIG) sprintf(errmsg, "E2BIG");
    if (errno == EILSEQ) sprintf(errmsg, "EILSEQ");
    if (errno == EINVAL) sprintf(errmsg, "EINVAL");
    fprintf(stderr, "Fail to iconv() errorno : %s(%d)\n", errmsg, errno);
}
iconv_close(cd);

// iconv() 처리 후 szOut 크기를 재계산해야 한다.
// iconv() 는 pIn2 를 szIn 크기가 0이 될 때까지 처리한다.
szOut = pOut2 - pOut;
FILE *fp = fopen("test.txt", "wb");
fwrite(pOut, 1, szOut, fp);
delete[] pIn;
delete[] pOut
fcloe(fp);