iconv 예제인데 오류가 발생하네요..
글쓴이: bluemoon / 작성시간: 금, 2004/02/20 - 6:55오전
libiconv를 사용한 간단한 예제인데 실행하면 Segmentation fault 가 발생합니다.
libiconv에서 제공하는 함수들의 인자들에 대해 제대로 이해를 못하고 있어 그러겠지요.. ;
예에서 s는 utf-8로 인코딩된 std::string 타입니다.
#include <iconv.h> ... char *outbuf = (char*)malloc(sizeof(strlen(s.c_str()) + 1)); char *inbuf; size_t in_byte, out_byte; iconv_t cd = iconv_open("EUC-KR", "UTF-8"); iconv(cd, (char**)&inbuf, &in_byte, (char**)&outbuf, &out_byte); iconv_close(cd); std::cout << outbuf << std::endl; free(outbuf);
Forums:
[code:1]char *outbuf = (char*)ma
char *outbuf = (char*)malloc(sizeof(strlen(s.c_str())*2 + 1));
가 되어야 하지 않나요?[code:1]char *outbuf = (char*)ma
char *outbuf = (char*)malloc(sizeof(strlen(s.c_str())*2 + 1));
char *outbuf = (char*)malloc(strlen(s.c_str())*2 + 1);
이게 맞지 않을까요 ;)
뭐.. 중간에 메모리가 모자라다면 errno 가 세팅되겠죠ㅤ +_+
그럼.. realloc을 하면 되겠고 :)
흠.. 근데 이것때문에 세그폴트난거는 아닐 듯 싶습니다..
다른부분에서 문제가 있을 듯 한데요..
메모리가 부족하다면..
E2BIG이 errno로 세팅될 뿐.. 세그폴트는 나지 않거든요..
(맞나 E2BIG 기억이 가물가물 =3=33)
흠흠.. 아주 간단하게 c로 테스트해보시는건 어떨까 싶은데요 ;)
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
malloc 나 free 에서 세그폴트가 나온다면이전에 malloc
malloc 나 free 에서 세그폴트가 나온다면
이전에 malloc 을 이용해 받은 버퍼를 사용하는데 있어서
오버플로우나 언더플로우가 됐기 때문입니다.
malloc 이랑 free 의 작동 원리를 알면 왜 그런지 이해 하실 거구요.
그 부분 말고 다른 부분에서 에러를 찾아 보세요
그게 문제인지 학인해 보고 싶으시다면 세크 폴트 나는 malloc 보다 앞에 malloc(10) 하는 식으로 단순하게 해보세요 그래도 에러가 날거에요.
그리고 strlen(string.c_str()) == string.size() 입니다. 앞에 방법은 느리니깐 뒤에껄 사용하세요.
제가 하려고 하는건 utf-8 -> euc-kr 변환입니다.소스
제가 하려고 하는건 utf-8 -> euc-kr 변환입니다.
소스를 다시 정리 해봤는데 봐주세요..
하지만 역시 Segmentation fault 메세지만 남기고 죽습니다. :(
출력 버퍼는 malloc했는데 입력 버퍼는 어디에...?
출력 버퍼는 malloc했는데 입력 버퍼는 어디에...?
한국 BSD 사용자 포럼
[quote="방준영"]출력 버퍼는 malloc했는데 입력 버퍼는 어디에
원 소스를 편집하는 과정에서 빠졌는데.. 넣어도 마찬가지긴 합니다. :roll:
[quote="bluemoon"][code:1]// -*- cod
여기까지에서 마지막 줄에서 세그폴트가 날듯한데요..
inbuf에 아직 메모리 할당이 안됐는걸요..
그리고 s.size()*2+1이 아니라.. s.size()가 되야할 듯 합니다..
정도로 하셔야 =333
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
되든 안되든 지금까지 소스를 정리해봤습니다.물론 여전히 실행중 죽지만
되든 안되든 지금까지 소스를 정리해봤습니다.
물론 여전히 실행중 죽지만..
사실... malloc(100)으로 한다해도 Segmentation fault 오류가 발생합니다.
아아.. 완전 이상한 곳만 후비고 있었군요 =3=33[code:1
아아.. 완전 이상한 곳만 후비고 있었군요 =3=33
iconv(converter, (char **)&inbuf, NULL, (char **)&outbuf, &oleft);
이 부분에 의해서... outbuf의 주소값은 변하게 됩니다..
(변환된문자열의 마지막부분을 가리키고 있을 듯 하군요.. 대강 봐서 확신은 못하겠습니다..)
그래서.. free할때 세그멘테이션 오류가 발생하는걸로 보입니다..
제대로 돌아가도록 고친 코드입니다 ;)
(네임스페이스는 전부 std만 쓰길래 =3=33 것도 약간 수정을..)
그리고 전 기본 Charset을 euc-kr을 쓰기 때문에.. euc-kr=>utf-8 로
약간 수정을 가해서 테스트했습니다 :)
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
감사합니다!
좀 전에 확인을 했는데 변환이 되는군요. ㅠㅠ
감사합니다. utf-8 -> euc-kr로도 변환이 되더군요.
가만보니 코드변환기가 하나 나왔버린셈이네요.. :oops:
그런데 처음부터 궁금했던것은 iconv() 함수의 인자들의 역할이었습니다.
gnu에서 문서를 봤지만 영문을 떠나서 내용을 이해하기가 힘들어서요..
아래 부분에대해 설명을 부탁드려도 될까요?
[code:1] ileft = s.size();
흠 안그래도 그래서 주석을 달아드렸는데 :)
별 도움이 안됐나보군요..
iconv함수의 원형은 이렇게 되어있습니다..
inbytesleft는 아직 남아있는 변환할 스트링의 사이즈구요 +_+;;
outbytesleft 는.. 남아있는 버퍼 크기입니다..
:D
in = inbuf = ..
out = outbuf = ..
이런식으로 쓴건 inbuf, outbuf는.. iconv를 수행한 후.. 변경이 되기 때문에..
나중에 메모리를 해제해주거나.. 제대로 접근을 하기 위해 ;) 그렇게 한겁니다.. 헤헷..
근데 저것만으로 사용하는 건 문제가 많을 듯 하군요 ;)
차라리 기본으로 있는 iconv를 쓰는게 :)
(버퍼가 모자란다거나.. 중간에 문제가 있는 바이트가 있다거나 하는거에
대한 에러처리도 하나도 안하고 있고.. 뭐 기타등등.. )..
룰루루
하튼 덕분에 iconv사용법도 익혔네요 =3=33
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
댓글 달기