인코딩(임시)

2020. 10. 17. 09:22데일리/오늘

해당 포스팅은 여러 가정(assume)에 기반했습니다.


해당 포스팅은 다음 포스팅들을 참고했습니다.

1. ANSI, UTF-8, UNICODE등이 대체 무엇인지 알려주는 포스팅

onlywis.tistory.com/2

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