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 |
08 | int 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
댓글 없음:
댓글 쓰기