iconv로 인코딩 변환시 에러

권순선의 이미지

Quote:
kldp:/var/lib/gforge# iconv -f euc-kr -t utf-8 sf_dump_for_gforge > sf_dump_for_gforge.utf
iconv: illegal input sequence at position 236942

http://kldp.net 을 업그레이드하기 위해 현재 database를 복구해서 집어 넣어야 하는데 새로 넣을 database가 utf-8을 사용하는지라 기존에 사용하던 euc-kr인코딩된 db 덤프 파일을 utf-8로 변환해서 복구해야 합니다.

그런데 위와 같은 에러가 발생하는군요. 아마도 파일내용 중간에 이상한 문자가 들어있어서 그런 것 같은데 몇번째 줄에 이상한 문자가 있는지 알려주지 않고 저런식으로 알려주니 찾을 수가 없네요.

이같은 상황에서.... 저 sf_dump_for_gforge 파일을 utf-8로 어떻게 변환할 수 있을까요?

정태영의 이미지

흠.. iconv POSIX가 원래 그렇다네요 :)
이 KDLP BBS같은 경우도 비슷한 문제가 있어요...

중간에 ㄷ ㅚ ㅆ 같은 글자나 깨진글자같이 인풋로케일에 맞지 않는 들어가면.. 그 이후로는 변환이 안되는 문제가 있거든요..

흠 저도 예전에 받아놨던.. 조합형문서가 중간에.. 깨진문자가 중간중간 들어있어서
제대로 볼수 없는 문제가 있어서 ㅠ_ㅠ;;

흠 iconv에.. -f옵션같은게 있어서.. 잘못된 문자를 만나면
1바이트를 건너뛰고 재시도하게 하는 식의 동작을 할 수 있게 하면 좋을듯 하군요..

아 어제 안그래도 iconv 관련해서 perky님과 얘기를 좀 했었는데..
py-iconv에선가는 기본적으로 1바이트를 건너뛰고 재시도를 하도록..
되어있다는 얘기를 들은 듯 하군요 :)

그걸 이용해보심이..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

krisna의 이미지

아마 별일 없으면 EUC-KR로도 되겠지만 사용자가 특별한 글자를 넣었다면 CP949로 시도해보는 것도 좋겠습니다.

권순선의 이미지

krisna wrote:
아마 별일 없으면 EUC-KR로도 되겠지만 사용자가 특별한 글자를 넣었다면 CP949로 시도해보는 것도 좋겠습니다.

다른 위치에서 또 오류가 발생하네요. :cry:
Quote:
kldp:/var/lib/gforge# iconv -f cp949 -t utf-8 sf_dump_for_gforge > sf_dump_for_gforge.utf
iconv: illegal input sequence at position 2238071
glimpsovstar의 이미지

전에 보니까.. 문자가 UTF8에 있는 넘이 있으면 그런 메시지 나오면서 에러 납니다.
맨페이지 바꿀때 보니까 사람이름에 영문위에 엑센트나 이상한 표시들 있는넘들은
다 이런 에러 뜨더라고요.

즉 코드페이지에서 커버 안하는 것들이 있음 그럴 가능성이 높다라는 얘기지요.

리눅스 만세~

정태영의 이미지

흠..

glibc에 있는
iconv_prog.c 에서 해당 에러가 발생하는 부분을 찾아봤습니다 ~.~

static int
process_block (iconv_t cd, char *addr, size_t len, FILE *output)
{
#define OUTBUF_SIZE     32768
  const char *start = addr;
  char outbuf[OUTBUF_SIZE];
  char *outptr;
  size_t outlen;
  size_t n;
                                                                                
  while (len > 0)
    {
      outptr = outbuf;
      outlen = OUTBUF_SIZE;
      n = iconv (cd, &addr, &len, &outptr, &outlen);
                                                                                
      if (outptr != outbuf)
      {
        /* We have something to write out.  */
        int errno_save = errno;
                                                                                
        if (fwrite (outbuf, 1, outptr - outbuf, output)
            < (size_t) (outptr - outbuf)
            || ferror (output))
          {
            /* Error occurred while printing the result.  */
            error (0, 0, _("\
conversion stopped due to problem in writing the output"));
            return -1;
          }
                                                                                
        errno = errno_save;
      }
                                                                                
      if (n != (size_t) -1)
      {
        /* All the input test is processed.  For state-dependent
             character sets we have to flush the state now.  */
        outptr = outbuf;
        outlen = OUTBUF_SIZE;
        (void) iconv (cd, NULL, NULL, &outptr, &outlen);
                                                                                
        if (outptr != outbuf)
          {
            /* We have something to write out.  */
            int errno_save = errno;
                                                                                
            if (fwrite (outbuf, 1, outptr - outbuf, output)
              < (size_t) (outptr - outbuf)
              || ferror (output))
            {
              /* Error occurred while printing the result.  */
              error (0, 0, _("\
conversion stopped due to problem in writing the output"));
              return -1;
            }
                                                                                
            errno = errno_save;
          }
                                                                                
        break;
      }
                                                                                
      if (errno != E2BIG)
      {
        /* iconv() ran into a problem.  */
        switch (errno)
          {
          case EILSEQ:
            if (! omit_invalid)
            error (0, 0, _("illegal input sequence at position %ld"),
                   (long int) (addr - start));
            break;
          case EINVAL:
            error (0, 0, _("\
incomplete character or shift sequence at end of buffer"));
            break;
          case EBADF:
            error (0, 0, _("internal error (illegal descriptor)"));
            break;
          default:
            error (0, 0, _("unknown iconv() error %d"), errno);
            break;
          }
                                                                                
        return -1;
      }
    }
                                                                                
  return 0;
}

흠흠.. 이 부분에서.. EILSEQ에 대한 처리를 좀 다르게 하면
끝까지 변환은 가능하지만... 어떻게 처리를 하는게 좋은 방법일지 모르겠군요..

len--;addr++;를 해주면서...

잘못된 문자로 체크된 글자를 출력해주는게 맞을지..
출력안해주고 그냥 무시하고 넘어가는게 좋을지 모르겠군요.. =3=33

여기선 E2BIG이 아니면 무조건 return을 해서 룹을 빠져나가버리기 때문에..
룹을 빠져나가지 않도록.. if elseif else형식으로 바꿀 필요가 있을 듯 합니다 흐흐흐

흠흠 g_convert에서는 ~.~
goto로 되있어서 건들 부분이 조금 더 적었는데.. 흠 하튼
간단한 패치로 가능은 할겁니다 =3=33

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

chunsj의 이미지

혹시 확장 완성형 글자가 있는 것이 아닌가요? 유명한 아햏햏 이런...
이런 것이 있으면 먼저 찾아서 다른 걸로 바꾸고 해야 되던데요?

권순선 wrote:
krisna wrote:
아마 별일 없으면 EUC-KR로도 되겠지만 사용자가 특별한 글자를 넣었다면 CP949로 시도해보는 것도 좋겠습니다.

다른 위치에서 또 오류가 발생하네요. :cry:
Quote:
kldp:/var/lib/gforge# iconv -f cp949 -t utf-8 sf_dump_for_gforge > sf_dump_for_gforge.utf
iconv: illegal input sequence at position 2238071
tokie의 이미지

iconv에서 euc-kr을 utf-8으로 변환하면 확장완성형이 보이지 않더군요.
cp949를 utf-8으로 변환하면 확장완성형까지 모두 변환됩니다.

테스트 페이지가 있는데 내부서버라 보여주지 못함이 아쉽습니당^^

wkpark의 이미지

iconv --help를 해보면

-c 출력에서 잘못된 문자를 제외합니다

옵션이 있네요.

iconv -c -f UHC -t UTF-8 를 이용하면 될 듯 합니다.

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

권순선의 이미지

박원규 wrote:
iconv --help를 해보면
-c 출력에서 잘못된 문자를 제외합니다

옵션이 있네요.

iconv -c -f UHC -t UTF-8 를 이용하면 될 듯 합니다.


감사합니다. 알려주신 옵션으로 일단 덤프한 파일의 인코딩을 utf로 바꾸었습니다. vim에서 인코딩을 utf로 하니 한글이 잘 보이는 것을 확인하였습니다.

그런데 db쪽에서 이번엔 새로운 문제가 나와 버렸네요. 삽질은 계속됩니다.... 8)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.