JNI 한글 문제

java는 기본적으로 UTF-8 인코딩을 사용한다.
자바 소스파일을 UTF-8 형식으로 저장하고, UTF-8로 컴파일 하면 전혀 문제가 없다.
UTF-8 컴파일 예시:   javac -encoding utf-8 jni/SHMNative.java jni/AlarmEvent.java

다만 이때에는 c++ 소스에서 UTF-8 기반으로 사용된다.

그런데 만약에 EUC-KR로 변환이 필요하다면 iconv로 이용하면 된다.

iconv tutorial을 보고 사용해봤는데,
의외로 잘되지 않았는데 IconvString 이라고 검색해보면 쓰기 좋게 만든 소스가 있다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>
#include <errno.h>

int IconvString (char *from, char *to, const char *src, char *dst)
{
    size_t srclen;
    size_t dstlen;
    size_t inleftsize, outleftsize;
    size_t res; /* report of iconv */
    iconv_t cd = (iconv_t)-1;

    char *inptr;
    char *outptr;

    /* open iconv */
    cd = iconv_open(to, from);
    if (cd==(iconv_t)(-1)) {
        return (int)cd;
    }

    if (!strcasecmp(from, "UCS-2")) inleftsize=2;
    else {
        srclen = (size_t)strlen(src);
        inleftsize = srclen;
    }
    outleftsize = inleftsize*4;
    dstlen = outleftsize;
    inptr = (char*)src;
    outptr = dst;

    while(1) {
        res = iconv(cd,(const char **)&inptr,&inleftsize,&outptr,&outleftsize);
        if (res == (size_t)(-1)) {
            if (errno == EILSEQ) { /* not defined char in the table ? */
                fprintf(stderr, "iconv_str: can't convert[%s]\n", src);
                /* for 2-byte code incompleteness */
                inptr++;
                inleftsize--;
            }
            else if (errno == EINVAL) { /* incomplete char, need readin more codes */
                fprintf(stderr, "iconv_str: incomplete char or shift sequence\n");
                if (inleftsize <= 2) {
                    *outptr = '?';
                    outleftsize--;
                    break;
                }
            }
            *outptr='?';
            outptr++;
            outleftsize--;
            inptr++;
            inleftsize--;
        }
        else break;
    }
    dst[dstlen-outleftsize] = '\0';
    /* close iconv */
    iconv_close(cd);
    return(dstlen-outleftsize);
}

Leave a Reply

Close Menu