2020. 10. 17. 09:22ㆍ데일리/오늘
해당 포스팅은 여러 가정(assume)에 기반했습니다.
해당 포스팅은 다음 포스팅들을 참고했습니다.
1. ANSI, UTF-8, UNICODE등이 대체 무엇인지 알려주는 포스팅
2. 각 OS마다 UNICODE를 지원하지 않는 Application Program에 대해 텍스트를 어떻게 표시할것인지
선택하는 제어판 interface
post.naver.com/viewer/postView.nhn?volumeNo=16967132&memberNo=1834
사건의 발단
교수님이 특정 cpp 파일을 enhance 시키라고 주셨는데, 해당 인코딩 방식이 ANSI였다.
인코딩방식은 ANSI, UTF-8 , UTF-16 등이 있다.
유니코드 (문자를 2byte 정수로 매핑시키는 방식)를 어떤 형식으로 할것인지가
바로 "인코딩방식"이다.
따라서 ANSI든 UTF-8든 그 특정한 인코딩방식을 디코딩 할 수 있다면,
다시 유니코드로 디스어셈블리 할 수 있다.
ANSI 방식은 8비트의 메모리를 사용한다.
7비트로 문자들을 표시하며, 나머지 1비트로 코드페이지를 이용하는데
이 1비트로 어떤 국가의 언어인지 나눈다.
(참고로 한국의 코드페이지는 949이다.)
docs.microsoft.com/ko-kr/windows/win32/intl/code-page-identifiers
를 참고한다면 확인 할 수 있다.
리눅스 OS를 사용한다면 cmd로 해당 파일의 인코딩 방식을 확인 할 수 있다.
나는 Windows OS를 사용하지만 minGW를 사용하여, 리눅스 command를 사용할 수 있다.
명령어는
file 파일이름
이다.
cmd창을 확인하면 해당 "인코딩방식"과 "개행문자"처리 방식을 확인 할 수 있다.
("개행문자" 처리방식은 다른 포스팅에서 이미 다뤘으니 넘어가도록 하겠다.)
해당 starter.cpp파일은 ISO-8859 인코딩방식을 사용한것을 확인 할 수 있다.
해당 인코딩방식에 대한 정보는 아래에서 확인 할 수 있다.
ko.wikipedia.org/wiki/ISO/IEC_8859
해당 위키피디아를 참고하면 ISO-8859는 ANSI 인코딩 방식이며, 한국어는 지원하지 않는
인코딩방식이란것을 알 수 있다.
따라서 해당 cpp파일의 한글주석은 빌드시 깨져서 소스코드를 침해할 수 있다.
이를 해결하는 방법은 해당 파일을
1. 코드페이지가 한국(949)인 EUC-KR 인코딩방식으로 변환하거나
2. 코드페이지가 필요치 않는 UTF-8 인코딩방식으로 변환해야한다.
목에 칼이 들어와도 UTF-8이 쓰고싶은걸 어떡해
누구든지 범용성이 좋은 글을 작성하고 싶을것이다.
내가 작성한 소스코드를 외국에선 못보고 그러면 얼마나 슬프겠어
우리나라를 포함한 전세계에서 가장 많이 사용하는 인코딩 방식은 UTF-8이다.
따라서 대가리가 깨져도 UTF-8 인코딩방식이 쓰고싶어서 해당 문제에 부딪혔다.
Visual Studio에서는 문제가 없었다.
그냥 별 수고없이 cpp파일을 메모장으로 열어서 ANSI 인코딩방식으로 되어있는 글들을 전문 복사해서 Visual Studio의 빈 소스파일에 집어넣고 빌드하니 아주 잘 컴파일 되었다. 따라서 문제가 없으니 문제가 무엇인지도 알지 못했다.
그런데 내가 쓰는 IDE는 Visual Studio가 아니라 CLion이다.
우선 CLion의 default 인코딩방식은 949이다. 즉 한글ANSI(=949)를 인코딩방식으로 사용한다는것인데,
정상적인 빌드환경을 위해선 3가지 요소가 부합해야한다.
1. 해당 소스코드의 인코딩방식
2. 해당 소스코드를 어떤 인코딩방식으로 인코딩하여 컴파일 할 것인지
3. 그 소스코드의 결과물을 보는 내 컴퓨터(OS)는 그 글자를 어떤 인코딩방식으로 읽을것인지
이렇게 3가지 요소가 모두 같아야한다.
어떤 묵시적 parsing이 존재하는지 모르니 모든 경우의 수를 따져 보았다.
(우선 3번은 잠깐 차치하자.)
1. CLion의 오른쪽 하단 인코딩방식을 변경하여 UTF-8로 설정
2. CLion의 Setting에 들어가서 Project 인코딩방식을 UTF-8로 설정
이렇게 하였더니, 컴파일러가 해당 소스코드를 읽지 못했다. 다음과 같은 오류메시지를 확인 할 수 있었다.
현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다.
데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
현재 코드페이지가 949라는것인데, 내 컴퓨터는 한글환경에서 돌아가고 있으니 OS에서 코드페이지를 949로 설정하고 있는것이 당연하다. 이는 cmd에서 chcp 명령어로도 확인 가능하다.
참고 포스팅의 2번을 확인 후 제어판에서 유니코드를 지원하지않는 프로그램에 대한 로캘 언어를 UTF-8로 변환했다.
다시 CLion을 켜서 위와같은 환경에서 다시 컴파일 했더니 컴파일도 잘 되고 콘솔창에도 한글이 잘 뜨는것을 확인 할 수 있었다.
여기서 다시 1번과 2번을 949로 변환 후 컴파일 해보았다. 이때도 컴파일은 되지만, 콘솔창에 깨진 한글이 출력되었다.
1번과 2번이 둘다 949이고, 로캘설정이 949로 되어있을때는 컴파일은 되지만 콘솔창에 깨진 한글이 출력 되었다.
정리하자면,
<로켈설정이 949일 때>
- CLion 설정이 949 -> 컴파일O 한글X
- CLion 설정이 UTF-8 -> 컴파일X 오류메시지(949에서 표시할 수 없음)
<로켈설정이 UTF-8일때>
- CLion 설정이 949 -> 컴파일O 한글X
- CLion 설정이 UTF-8 -> 컴파일O 한글O
이 경우의 수들을 보자면, ★
<로켈설정이 949일 때>
- CLion 설정이 UTF-8 -> 컴파일X 오류메시지(949에서 표시할 수 없음)
CLion이 UTF-8로 잘 변환하지만, 내 OS에서 해당 소스코드를 계속 949로 읽고 있기 때문에, 컴파일 타임의 소스코드는 949이다. (따라서 인코딩 후, 누군가에게 건내주었을 때, 해당 PC가 UTF-8이라면 파일을 받아서 정상적으로 UTF-8 컴파일 할 수 있다.) 따라서 949 소스파일을 UTF-8로 IDE가 인식하며 컴파일하려니 오류메시지가 발생한다.
<이거 그냥 인코딩이 잘 안되는거 아닐까 기존 ANSI에 한글 코드데이터가 없으니까
UTF-8 변환할때 예를들어:태국어 로 변환하는거지>
<그럼 기존ANSI->한글ANSI->UTF-8 변환하면 되야되는데...>
<로켈설정이 UTF-8일때>
- CLion 설정이 949 -> 컴파일O 한글X
CLion이 949로 잘 변환하지만, 내 OS에서 해당 소스코드를 계속 UTF-8로 읽고 있기 때문에, 컴파일 타임의 소스코드는 UTF-8이다. 따라서 UTF-8 소스파일을 949로 IDE가 인식하며 컴파일하려니 오류메시지가 발생한다.
'데일리 > 오늘' 카테고리의 다른 글
인코딩(+=) (0) | 2020.10.20 |
---|---|
C++ (0) | 2020.10.07 |
memory는 lvalue, elem, func_pointer, vector (0) | 2020.10.02 |
static 변수의 선언은 (0) | 2020.09.12 |
소스 코드 정렬 키 (0) | 2020.09.11 |