혹시나 다들 Linux에서 프로그래밍 하시면서 아래와 같은 에러를 경험 하신 분이
있으리라 생각됩니다.
myfoo.cpp:1: error: stray ‘\357’in program
myfoo.cpp:1: error: stray ‘\273’in program
myfoo.cpp:1: error: stray ‘\277’in program
myfoo.cpp:1: error: stray ‘#’ in program
바로 BOM(Byte Order Mark) 문자 때문에 GNU GCC 컴파일러가 에러를 낸 것인데요.
이러한 이유는 유니코드 인코딩 방식(UTF-8, UTF-16 등..)이 서로 상이하게 때문에
나타나는 에러입니다. 즉, GCC 컴파일러는 기본적으로 UTF-8을 INPUT 파일로
인코딩 하게 됩니다. 하지만 문제가 되는 것은 문서 파일에 3Byte의 BOM 문자(EF BB BF)가
들어가 있는 것입니다.
보통은 UTF-8에는 BOM 문자가 무의미한테, 들어간 이유는 윈도우 메모장으로 텍스트를
저장했다거나, VI 에디터 환경설정에서 set bomb 이 된 상태로 생각될 수 있습니다.
이 경우의 해결방법은 크게 두 가지가 있습니다.
첫 번째로, 강제로 BOM을 제거해주는 것입니다. xxd를 사용하여 강제로 제거하는 것이지요.
# g++ -x c++ <(xxd -g 1 -s 3 myfoo.cpp | xxd -g 1 -s -3 -r) -o myfoo
두 번째로, VI 에디터에서 set unbomb 을 설정하여 BOM 문자가 삽입되지 않도록 하는 것입니다.
VI 에디터가 아니더라도, UTF-8 Signature 설정을 remove 로 설정해 사용하면 될 것입니다.
괜히, 텍스트 파일을 fopen으로 열었는데 어의없게 바로 데이터가 안 읽어지고, EE BB BF가
나온다면 의심해볼 만하지요^^?
참고로, Big/Little Endian에 따라서 BOM 문자가 달라질 수도 있습니다.
자세한 사항은 인터넷을 참고하세요^^
기타 g++ 컴파일러의 인코딩 방식을 변화 시키려면 -finput-charset=CHARSET 형식으로
지정해주면 해당 CHARSET이 UTF-8 형식으로 변환된다. ^^