glibc iconv
glibc 의 iconv 함수를 이용해서 EUC_KR을 UTF8로 변경하고 싶은데, 우선 PC linux 에서 는
아래와 같이 작성을 해서 테스트 해본 결과 잘되는것을 확인했습니다.
실제 사용환경은 ARM 프로세서라 cross compile 해서 돌려보면
iconv_open 에서 에러가 (-1) 리턴함. 그래서 여기 저기 찾아보니 glibc iconv 구현이
변환 모듈을 동적 로딩 하도록 되어서 ramdisk 에 /usr/lib/gconv에 관련 모듈(*.so)와
gconv-modules를 복사해서 넣어놓고 다시 돌려봤는데 역시나 동작을 안합니다.
샘플 프로그램은 static으로 컴파일 하도록 사용하고 있는데, 컴파일 에러는 안나고 있습니다.
여기서 질문사항은
1. iconv 를 사용하기 위해서 해줘야 할 사항. 특히 glibc가 gconv의 모듈 path를 어떻게 찾는지요?
2. 혹은 gconv 를 동적 모듈이 아닌 static 으로 컴파일 할 수 있는 방법이 있는지요?
아래는 테스트한 코드입니다.
#include
#include
#include
#include
#include
# define BTN_VIDEO_LB "비디오"
//# define BTN_VIDEO_LB "asdfsadf"
#define DEBUG
#ifdef DEBUG
# define DBG printf
#else
# define DBG(args...)
#endif
int main(void)
{
char buf[100];
char buf2[100];
printf("org %s, len (%d)\n", BTN_VIDEO_LB, strlen(BTN_VIDEO_LB));
euckr2utf8(BTN_VIDEO_LB, buf);
printf("orig -> utf8 : %s, len (%d)\n", buf, strlen(buf));
utf82euckr(buf, buf2);
printf("utf8 -> euckr : %s, len (%d)\n", buf2, strlen(buf2));
return 0;
}
int euckr2utf8(char *inbuf, char *outbuf)
{
size_t inbytesleft;
size_t outbyteleft;
char *inbuf_p = inbuf;
char *outbuf_p = outbuf;
iconv_t cd = iconv_open("UTF8", "EUC-KR");
if (cd < 0) {
perror("iconv");
return 1;
}
inbytesleft = strlen(inbuf);
assert(inbytesleft != 0);
DBG("inbytesleft %d \n", inbytesleft);
outbyteleft = 999;
iconv(cd, &inbuf_p, &inbytesleft, &outbuf_p, &outbyteleft);
DBG("outbyteleft %d\n", outbyteleft);
iconv_close(cd);
return 0;
}
int utf82euckr(char *inbuf, char *outbuf)
{
size_t inbytesleft;
size_t outbyteleft;
char *inbuf_p = inbuf;
char *outbuf_p = outbuf;
iconv_t cd = iconv_open("EUC-KR", "UTF8");
if (cd < 0) {
perror("iconv");
return 1;
}
inbytesleft = strlen(inbuf);
assert(inbytesleft != 0);
DBG("inbytesleft %d \n", inbytesleft);
outbyteleft = 999;
iconv(cd, &inbuf_p, &inbytesleft, &outbuf_p, &outbyteleft);
DBG("outbyteleft %d\n", outbyteleft);
iconv_close(cd);
return 0;
}
EUC-KR.so 와 gconv-modules
EUC-KR.so 와 gconv-modules 만 있어도 되야 하는데...
타겟보드에 strace 가 있다면 어떤 패스를 뒤지는 지 살펴보세요.
에라 모르겠다 싶으면 GCONV_PATH 환경변수로라도...
그리고,
적어주신 대로
적어주신 대로 해보려고 했는데 strace 가 없어서 strace를 넣고 컴파일 한 후 Target에서 strace를 해보니
gconv-module은 /usr/lib/gconv-modules에서 잘 open 했는데 EUC-KR.so 를 open 한 후 libc.so.6와 ld-linux.so.2를 찾네요, 저는 shared library를 안쓰고 있는데 ㅠㅠ 그래서 위 두 파일을 ramdisk/usr/lib 에 복사해 넣은 후 TARGET에서 다시 iconv sample 프로그램을 돌려보니 이제는 정상 동작 합니다.
strace 란것을 몰랐는데 아주 좋습니다. 감사합니다.
시간나면 shared library 를 안쓰도록 하는 방법을 찾아봐야 겠습니다.
iconv 가 glibc2.1.3 부터
iconv 가 glibc2.1.3 부터 포함됐는데, 그 전까진 독립 패키지였습니다.
아직도 sourceforge 에 유지되는 것을 본 것 같습니다.
기계에서, euc-kr -> utf8 로만 사용할 것이라면 glibc::iconv 말고 다른 방법도 많을 것 같습니다.
gconv는 glibc 2.1.x부터
gconv는 glibc 2.1.x부터 구현되었습니다.
iconv는 별도에 어플이고 gconv와는 구현방식부터 전혀 다릅니다. gconv는 glibc용으로 새롭게 만들어진 것입니다.
온갖 참된 삶은 만남이다 --Martin Buber
댓글 달기