glibc iconv

sosuri78의 이미지

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

bushi의 이미지

EUC-KR.so 와 gconv-modules 만 있어도 되야 하는데...
타겟보드에 strace 가 있다면 어떤 패스를 뒤지는 지 살펴보세요.
에라 모르겠다 싶으면 GCONV_PATH 환경변수로라도...

그리고,

if ((int)cd < 0) {
 ....
}

sosuri78의 이미지

적어주신 대로 해보려고 했는데 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 를 안쓰도록 하는 방법을 찾아봐야 겠습니다.

bushi의 이미지

iconv 가 glibc2.1.3 부터 포함됐는데, 그 전까진 독립 패키지였습니다.
아직도 sourceforge 에 유지되는 것을 본 것 같습니다.
기계에서, euc-kr -> utf8 로만 사용할 것이라면 glibc::iconv 말고 다른 방법도 많을 것 같습니다.

wkpark의 이미지

gconv는 glibc 2.1.x부터 구현되었습니다.
iconv는 별도에 어플이고 gconv와는 구현방식부터 전혀 다릅니다. gconv는 glibc용으로 새롭게 만들어진 것입니다.

온갖 참된 삶은 만남이다 --Martin Buber

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.