libiconv - 오류 ISO-2022-JP?

hiongun의 이미지

캐릭터셋 인코딩에 관한한 libiconv 를 사용하면 모든 변환을 100% 할 수 있을
것이라는 믿음을 무참히도 깨는 예가 있습니다.

제가 확인한 바에 의하면, libiconv 라는 라이브러리가 거의 믿을 게 못되는 수준인데
다른 사람들 경험은 어떤지 모르겠네요.

디코딩 안되는 예 (1)

파일명에서 발견된 글자: Ehwa_-_order_n=B0_21858-94748.pdf

Quoted-Printable 입니다. 중간에 =B0 에 해당하는 부분이, ISO-8859-1 로 인코딩된
특수 문자인데 (0xB0), "섭씨 몇 도"할 때 온도를 나타내는 오른쪽 윗 동그라미 글자입니다.
한글 코드에는 (˚)라는 글자가 있는데, 그리고 UTF-8에도 해당 글자가 있는데,
EUC-KR로 매핑하거나, UTF-8로 매핑하려고 하면 libiconv 가 매핑을 못하네요.

디코딩 안되는 예 (2):

^[$B%^%9%?!<%5!<%PE}9gEy$N;Y1g^[(B

일본어 ISO-2022-JP 로 된 문자열입니다. ^[ 는 두 글자가 하나고 'Escape'문자
한글자입니다.

이 문자열에 대해서 중간중간에 해석 못하는 글자가 끼어 있네요. UTF-8로 보낼 때는
깨지지 않는데, 그것을 EUC-KR로 보내려고 하니 중간에 좀 문제가 있네요.

윈도우즈 브라우저에서 보면: マスターサーバ統合等の支援 이렇게 잘 해석하는데,
중간에 'ー'이라는 한일(一)자도 아닌 것이, 대쉬(-)도 아닌 것이 끼어 있는 바람에
디코딩이 잘 안되네요. //TRANSLIT 옵션이 "유사한 문자로 매핑" 이라는 개념인데
이런 경우에 써 먹으라는 게 아닌가요?

제가 libiconv에 너무 많은 것을 바라는 것인가요?

bushi의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
 
int main()
{
    char *str="\x1b$B%^%9%?!<%5!<%PE}9gEy$N;Y1g\x1b(B";
    iconv_t ic;
    int inleft,outleft;
    char obuf_[1024], *obuf=&obuf_[0];
    char ibuf_[1024], *ibuf=&ibuf_[0];
    int ret;
 
    sprintf(ibuf, "%s", str);
 
    ic = iconv_open("UTF8", "ISO-2022-JP");
    if ((int)ic == -1) {
        perror("");
        return 0;
    }
 
    inleft = strlen(ibuf);
    outleft = sizeof(obuf_);
 
    printf("%d, %d\n", inleft, outleft);
    fflush(stdout);
 
    ret = iconv(ic, &ibuf, &inleft, &obuf, &outleft);
 
    printf("%d, %d, %d\n", ret, inleft, outleft);
    fflush(stdout);
 
    printf("%s\n", obuf_);
 
    iconv_close(ic);
 
    return 0;
}

[bushi@rose net]$ ./jp
32, 1024
0, 0, 985
マスターサーバ統合等の支援
[bushi@rose net]$

cjh의 이미지

일본어의 긴 - 는 카타카나의 장음 표기입니다. 이걸 마이너스(-)로 대체할 수는 없지요.
한글의 ㅡ(으)를 ASCII로 변환할 때 마이너스(-)로 적당히 변환할 수 없는 것과 같은 이유입니다.

재미있는건 SJIS/ISO-2022-JP를 EUC-KR로 변환할 때, 일본어 문자셋에 있는 장음 기호가
EUC-KR에는 없습니다. 하지만 가나 문자는 들어 있습니다.
따라서 장음 기호는 대체가 안되고 글자가 없어지거나 ? 등으로 대체되지요.
EUC-KR에는 일본어 가나 문자가 들어 있어서 이럴 때 편리한 점도 있지만, 장음 기호같은 기본적인
기호가 없는 것도 골치입니다. 따라서 ISO-2022-JP -> EUC-KR이 제대로 되리라고
처음부터 기대하지 않는 편이 좋습니다. (일본어 문자열을 한글 문자열로 바꿀 수 없지요.
EUC-KR안에 가나 문자가 들어있기 때문에 발생하는 일종의 착시라고 보시면 됩니다)

--
익스펙토 페트로눔

--
익스펙토 페트로눔

bushi의 이미지

그동안 그냥 무심코 지나쳤었는데, 글을 읽고나서
iso-2022-jp -> euc-kr이라는 변환자체가 비극이라는 걸 깨달았습니다.
아주... 환장하겠네요.

bushi의 이미지

http://htmlhelp.com/reference/charset/

...
   char *str = "Ehwa_-_order_n\xb0_21858-94748.pdf"
...
   ic = iconv_open("UTF8", "ISO-8859-1");
....

[bushi@rose net]$ ./jp
31, 1024
0, 0, 992
Ehwa_-_order_n°_21858-94748.pdf0
[bushi@rose net]$

소스에 버그가 있음이 밝혀졌습니다 ㅠ.ㅠ

...
    obuf_[sizeof(obuf_)-outleft] = 0;
    printf("%s\n", obuf_);
...

땜빵수정.
[bushi@rose net]$ ./jp
31, 1024
0, 0, 992
Ehwa_-_order_n°_21858-94748.pdf
[bushi@rose net]$

댓글 달기

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