본문 바로가기
IT 공부/Visual Studio 툴 사용하기

[Visual Studio] - 소스코드를 가져오거나 컴파일할 때 한글 인코딩 문제

by exdus3156 2024. 12. 21.

 

< 해결할 수 있는 궁금증 >
1) Visual Studio의 소스코드 편집기의 인코딩을 UTF-8로 변경할 수 있다.
2) 컴파일러에게 소스코드의 인코딩이 UTF-8이라고 설정할 수 있다.

 

 

#1. VS의 인코딩 문제

 

인코딩 문제는 어떤 프로그래밍 언어를 사용하든 한 번쯤은 만날 수 밖에 없는 오류다.

 

 

 

▷ 외부에서 가져온 소스코드를 나의 Visual Studio로 열면 가끔 위와 같은 에러 메시지가 뜬다. 이것은 해당 소스코드가 UTF-8로 인코딩한 파일인데, VS가 기본적으로 로컬 시스템의 환경인 CP949로 텍스트 편집기를 설정하므로 CP949 관점에서 식별 불가능한 데이터를 만나 무슨 문자인지 해석이 안 된다는 뜻이다. 즉, UTF-8로 저장한 바이트 값 중 일부가 CP949에서 약속되지 않은 불명의 값이라 에러를 뱉은 것이다.

 

 

▷ 우리의 악명 높은 레거시의 MS답게, Microsoft의 Visual Studio는 따로 옵션을 지정하지 않으면, 로컬 환경에 깔맞춤된 인코딩 환경으로 모든 소스코드를 다룬다고 말한다. 소스코드를 생성해도 텍스트 편집기의 인코딩은 CP949이고, VC++ 컴파일러도 CP949로 소스코드 데이터를 해석한다. Visual Studio는 기본적으로 개발자가 로컬에서 동작하는 윈도우즈 소프트웨어를 개발한다고 가정하기 때문이다.

 

실제로 VS에서 생성한 소스코드를 메모장으로 열어보면 ANSI(CP949)로 읽어야만 정상적으로 보이며, 만약 UTF-8로 디코딩할 경우 깨진다.

 

▷ CP949가 ASCII와 호환되고, UTF-8도 ASCII와 호환되니 영어 알파벳까지야 문제 없고, C/C++ 소스코드는 영어로 이루어져 있으니 큰 문제는 없지만, 원본 소스코드에 CP949로 식별 불가능한 한글 UTF-8 데이터가 있어 결국 깨질 수 밖에 없다. 

 

물론 VS의 에디터 편집기의 인코딩을 바꾸는 것은 가능하다. [editorconfig]나 다른 옵션을 이리저리 바꿔가며 소스코드를 UTF-8로 저장하거나 불러와서 소스코드를 UTF-8로 볼 수는 있다. 그러나 결국 내부의 VC++ 컴파일러는 에디터의 인코딩 설정이 뭔지 상관 없이 소스코드의 문자열을 CP949(MBCS)로 해석하려고 하므로, 빌드를 하는 과정에서 결국 오류를 만나고 만다.

 

▷ 같은 한글이라도 에디터에 "글"을 입력하는 것과 "한"을 입력하는 것이 다른데, 후자만 에러를 뱉어낸다. 왜냐하면 둘 모두 UTF-8로 3바이트의 값이 들어가는데, "한" 값의 경우 CP949 코드페이지 기준에서는 그래도 불가능한 값은 아니기 때문이다. 그러나 후자 "한"의 UTF-8 값은 CP949로 식별 불가능한 값이다. VS 컴파일러는 "한"의 바이트 값 자체를 CP949로 인식한다. "한"의 UTF-8 값은 ED 95 90. 그런데 CP949에서 ED 95 는 약속되지 않은 값이다. 이 말은 결국, 에디터를 UTF-8로 쓰고 그것이 화면에 잘 나온다고 해도, Visual Studio 컴파일러는 내부적으로 CP949 방식으로 데이터를 해석하려고 한다는 것이다. 

 

 

# 결론 : 해결 방법은?

 

 

구글링을 해보니 대부분 VS에서 위와 같이 .editorconfig 파일을 사용해 VS의 소스코드 에디터의 인코딩만 변경하는 것을 소개하고 끝난다. 이것도 중요하다! 그러나 이것만으로는 안 된다. VS의 에디터에게 UTF-8을 설정해봤자, 그냥 소스코드라는 텍스트 파일을 단지 UTF-8로 기입하고 스크린에 보여주는 것일 뿐, 컴파일러가 CP949로 소스코드의 바이너리 데이터를 읽는 것을 막지를 못하므로 빌드 문제를 해결할 수가 없다.

 

해결은 간단하다. Visual Studio 홈페이지에 나와 있는 것처럼, 아예 컴파일러의 옵션 자체를 변경해야 한다. 컴파일러가 인식하는 코드페이지 자체를 변경하는 것이다. 아래처럼 설정하면 VS 컴파일러는 소스코드의 인코딩을 UTF-8이라고 인식한다. 

 

 

주의하자! 이 조치는 컴파일러가 소스코드를 UTF-8로 인코딩되었다고 가정하고 해석한다는 뜻이지, 빌드 결과물의 문자열을 UTF-8로 처리한다는 뜻이 아니다.

 

  "" 따옴표로 사용한 char 타입의 문자열은 여전히 CP949로 인코딩되어 빌드된다. 이건 Windows의 C언어 개발 환경이 char 타입을 시스템 환경(MBCS)에 맞게끔 해석하기 때문이다. 그래도 적어도 UTF-8로 소스코드를 쓰고 보고 빌드할 수 있다!

 

나는 이렇게 설정하는 것을 선호하는데, 소스코드를 UTF-8로 하는 것이 무언가 마음이 편하다. CP949라는 것이 마음에 들지 않기도 하고, 깃허브에 로드되는 소스코드도 대부분 UTF-8로 작성되었기 때문이다.