'iconv'에 해당되는 글 2건

  1. 2010.06.24 오늘도 실수.. iconv
  2. 2010.05.31 mmap 사용시 알아둘 사항 (버스오류)

오늘도 실수.. iconv

문자열을 변환하는데.. "춏" 이런 글자가 나오면 문제가 생기길래..

로케일 문자에러가 생긴다는 생각은 했는데...

암튼 막 문제가 생기는거 같은 부분을 쭉쭉 타고 역으로 올라가다보니깐 (한시간 더 찾았다 -_-)

perror(); 써서 확인해보니깐
"부적절하거나 불완전한 다중바이트 또는 광역 문자" 라는 메세지가 뜨고.....

그래서 설마 하며 #define한걸 보니

#define LRC_FILE_LOCALE    "EUCKR //IGNORE"         /*  */
#define PRINTED_LOCALE     "UTF8"          /*  */

UTF8 => EUCKR로 변환하는건 옵션을 붙였는데
EUCKR=> UTF8로 변환할때는 옵션을 안붙였네 아놔...

아나 iconv_open 하는 부분의 //IGNORE 가  빠져 있음 ....

//IGNORE  추가....
#define PRINTED_LOCALE     "UTF8 //IGNORE"          /*  */

결국엔

iconv_open("EUCKR //IGNORE", "UTF8 //IGNORE"); // 이런식이 되시겠다.... 맞나 이게...

맨 페이지 아저씨는 이렇게 말씀하셧따.

       //TRANSLIT
              When  the  string  "//TRANSLIT"  is appended to tocode, transliteration is activated.  This means that when a character cannot be represented in the target
              character set, it can be approximated through one or several similarly looking characters.

       //IGNORE
              When the string "//IGNORE" is appended to tocode, characters that cannot be represented in the target character set will be silently discarded.

- 요약하자면... 그냥 로게일 뒤에
"//IGNORE" 써주면 인식 못하는 문자는 무시한다는거구
"//TRANSLIT"는  iconv_open이 비슷한 문자를 알아서 때려넣어(?) 준다는것

오늘의 병신짓 ㅜㅜ.. 이젠 출력되다가 중간에 끊어먹는 버그 해결

에휴 시간 아까워...

'Programming > C' 카테고리의 다른 글

포인터 연습  (6) 2011.05.27
간단한 디버그 함수  (0) 2010.08.16
아아 또 실수~!  (4) 2009.06.22
주의력 부족  (2) 2009.06.22
이진트리를 만들고나서....아 망했어요...  (2) 2009.05.25

mmap 사용시 알아둘 사항 (버스오류)


mmap  이라하면... seek 같은 귀찬은짓 안하고 파일에서 메모리로 사상 받은다음에,

그 메모리를 조작하면 자동(?) 으로 그 (메모리에 변경된 내용)이 파일에 저장되는 참 편한 넘이져.

(꼭 파일 디스크립터가 있어야하는건 아니지만.......)

근데 문제는,,,저 int files의 파일/파일 디스크립터를 open 할떄 주의 해야하는게...

NAME  
       mmap - map pages of memory

SYNOPSIS
       #include <sys/mman.h>

       void *mmap(void *addr, size_t len, int prot, int flags. int fildes, off_t off);

mmap을 사용할때는 Target 이 되는 파일이 write할 길이보다 커야한다. 는거........

(그러므로 (아래서도 적었지만) 당연히 파일크기가 0가 되서는 안됨)

만약 그렇지 않다면 "버스 오류" 라는 메세지를 출력하고 프로그럄이 종료되어버리는 문제가 생긴다.

O_TRUNC 같은 옵션을 open 함수 사용할때 놓어서도 안되므로 주의 하도록 하자,

그니깐 정리하면.... "mmap은 쓸파일의 크기를 변경할수 없다" 는것..

버스 오류가 나면 참고하도록하자.

joinc에 주의사항하나 정도는 적혀있을듯 했었는데.. 없었던거 같다 (아님 내가 제대로 안읽었던가)

kldp에는 비슷한 내용의 글타래가 올라왔던거 같으니깐 구글에서 찾아보세염.

이걸 왜 했냐면......----------------------------

euckr로 변환된 문서를 utf8로 적용하려고, iconv를 쓰다보니...문제가 생겼다

버퍼 크기가 작어서(euckr로 잡으니) 로케일이 변경되다가 말았던것....

저번엔 utf8->euckr로 변경할때는 어짜피 파일크기가 utf8크기가 크니깐, 그냥 utf8파일 크기를 버퍼 크기로 줘도

상관없었는데, 문제는 그 반대의 상황이 문제였던것...

그래서 메모리 사상을 써봐서 해결해 볼까.......... 해서 mmap을 쓸려고 하니깐....

뭐야... 이것도 결국 버퍼 크기 알아야 하잖아... 챗...

그냥 iconv 함수 쓸때 euckr파일크기 * 2 (사실 1.5배만 해도 충분하다고 하지만) 로 최대 버퍼 잡아서 넘겨버렸다..

(http://kldp.org/node/68263)

잘 되네 변환..

이제 터미널에서 글자폭을 알아야 할 차레...

(뭐 정안되면 UTF8용으로 글자폭 알아보던 함수를 다시 한번 수정해야겠다.

지금 만든건 CJK(한글, 한문, 히라/가타카나)는 글자폭을 제대로 알아오는데.............

러시아어(...) 같은건 제대로 못얻어 와서....... wscol인가.. 그건 왜 눅스에 없을까...)

에이 걍 터미널에서 삽질하지 말고 gtk로 ...?..
prev 1 next