< 해결할 수 있는 궁금증 >
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로 작성되었기 때문이다.
'IT 공부 > Visual Studio 툴 사용하기' 카테고리의 다른 글
[Visual Studio] - 문자 집합 옵션과 UNICODE 매크로 (0) | 2024.12.26 |
---|---|
[Visual Studio] - CRT 런타임 라이브러리의 빌드 방식 (0) | 2024.12.26 |
[Visual Studio] - #include 따옴표(")와 꺾쇠(<>)의 차이 (1) | 2024.12.24 |
[Visual Studio] - 정적 라이브러리와 같이 빌드하기 (0) | 2024.12.24 |
[Visual Studio] - 소스파일과 빌드 산출물을 깔끔하게 구성하는 방법 (0) | 2024.12.23 |