數奇雜記  

20070622 leading bytes in UTF-8 document
 2007년 6월 22일 (금요일) 비가 조금씩 계속 내린다. 오전부터 맑아지다. 

UTF-8 문서 BOM

C로 텍스트 문서를 파싱(parsing) 하다가 아주 곤란한 경우를 당했다. 첫번째 레코드가 나오지를 않는다. 도대체 무슨 문제인가? 원인은 UTF-8 문서의 처음에 붙어있는 BOM이었다.

MS 워드 2003에서 텍스트를 UTF-8로 저장하면 파일의 처음에 FEFF의 4바이트를 꼭 붙인다. 자신들의 인코딩체계와 달라서인지 BOM(Byte Order Mark)으로 이거를 구분자처럼 붙이는데 (메모장도 마찬가지), 리눅스로 파일을 가져오면 아주 처리하기가 곤란하다. 기본적으로 vi에서는 안보이기 때문에 제거하기가 곤란하다. 더구나 프로그래밍을 할 때 첫번째에 이 구분자가 들어있다는 것을 인식하지 못하는 경우가 많아서 여러가지 문제를 일으키기 다반사다. strcmp나 strncmp로 UTF8 문서를 파싱하려는 데 첫번째 줄은 문제가 발생한다면 이런 경우로 볼 수 있다.

바이너리 편집기를 사용하면 이걸 없앨 수 있다고 한다. 리눅스에서는 어떤 바이너리 편집기를 사용해야 하나? 찾아보기 귀찮다. 더 귀찮을 지도 모르지만 노가다를 했다. 빈줄 하나만 들어 있는 문서 kk를 만들고 원본문서(xx라고 하자)를 cat 명령어로 뿌린 다음 화면을 yy라는 파일로 보냈다.

이젠 vi에서도 이 문자(<feff>)를 볼 수 있다. 첫줄, 둘째줄과 이 문자를 지우면 깨끗해진다. 엠에수 윈도우에서 만든 UTF-8 문서를 다루다가 리눅스 프로그램에서 오류가 나면 이 문제를 한번 살펴보면 도움이 될 것 같기도 하다. (나의 예에서는 문서를 이렇게 고치지 않고 문서의 처음에 줄바꿈을 넣어서 처리했다. 파서 다 만들고 이렇게 하면 되는 것을 알았다.)


KSnapShot

윈도우에서는 ACDsee나 다른 화면 캡쳐 도구가 많다. KDE 윈도우 관리기에도 화면 캡쳐할 수 있는 좋은 도구가 있다. KSnapShot이라는 거다. 간단하고 편리하다. 윗 글의 hanterm-xf 캡쳐한 것도 이 도구를 사용했다. 리눅스에서 화면 capture 받을 일이 있으면 편리하게 사용할 수 있을 것 같다. 기념으로 내 노트북의 full screen snapshot 한장...

참고로 화면의 탑은 경주 불국사의 다보탑이다...

문의나 조언은 메일로... | 저작권처음으로