2012년 2월 5일 일요일

iconv() 함수 사용하기


iconv_open() 함수는 dest, source 형식으로 인자를 받고
iconv() 함수는 2중 포인터를 사용한다.

#include <iconv.h>

iconv_t iconv_open(const char *tocode, const char *fromcode);
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);

iconv_open(TO, FROM);
이므로 반대로 넣으면 이상하게 나온다. 주의요망!

그리고 iconv() 함수는
문자열 변수들은 2중 포인터로 넘겨주고(왜?)
inbytesleft는 strlen(*inbuf) 의 값을
outbytesleft는 strlen(*outbuf) 의 값을 넣어주면된다.

물론 변환에 따라서, 길이가 가변적으로 달라질수 있기 때문에 주의해야 한다.

만약, 변환중 메모리가 넘치게 되면 EILSEQ 에러가 발생하게 되며, (물론 넘치기 전에 데이터는 빼낼수 있다.)
변수의 포인터가 2중 포인터가 아니면
"__gconv: Assertion `outbuf != ((void *)0) && *outbuf != ((void *)0)' failed."
이런 에러를 만나게 될 것이다.



01#include "stdio.h"
02#include "string.h"
03#include "iconv.h"
04#include "errno.h"
05 
06#define BUFF_SIZE 64
07 
08int main()
09{
10        iconv_t cd = iconv_open("UNICODE""UTF-8");
11        if (cd == (iconv_t)(-1))
12        {
13                perror("iconv_open");
14                return 0;
15        }
16 
17        char inBuf[BUFF_SIZE] = "Hello world";
18        int inBufSize = sizeof(inBuf);
19 
20        char outBuf[BUFF_SIZE];
21        int outBufSize = sizeof(outBuf);
22        memset(outBuf, 0, outBufSize);
23 
24        // convert
25        size_t readBytes = strlen(inBuf);
26        size_t writeBytes = sizeof(outBuf);
27        char* in = inBuf;
28        char* out = outBuf;
29 
30        printf("readBytes:%d writeBytes:%d\n",readBytes,writeBytes);
31 
32        if (iconv(cd, &in, &readBytes, &out, &writeBytes) == -1)
33        {
34                printf("failed to iconv errno:%d EILSEQ:%d\n"errno, EILSEQ);
35        }
36        else
37        {
38                int idx;
39                printf("in:%x out:%x\n",in,out);
40                printf("readBytes:%d writeBytes:%d\n",readBytes,writeBytes);
41                for(idx = 0; idx < BUFF_SIZE; idx++)
42                {
43                        printf("%03d %c %x\t\t", idx, inBuf[idx], inBuf[idx]);
44                        printf("%03d %c %x\n", idx, outBuf[idx], outBuf[idx]);
45                }
46                outBuf[writeBytes] = '\0';
47        }
48 
49        iconv_close(cd);
50        return 0;
51}



출처 URL : http://minimonk.tistory.com/1543

댓글 없음:

댓글 쓰기