본문 바로가기

진리는어디에

[C++] 윈도우 콘솔에서 UTF-8 출력하기

들어가며

C++을 이용해서 UTF-8로 인코딩된 파일의 내용을 읽어와 콘솔창에 출력 할 때, 특히 윈도우의 경우 '?쒓??뚯뒪?' 처럼 텍스트가 깨져서 콘솔에 출력 된다. 기본적으로 유닉스 베이스 OS 콘솔은 코드페이지가 UTF-8을 지원하지만, 윈도우 콘솔은 기본 아스키 코드 페이지이기 때문에 SetConsoleOutputCP 함수를 이용해 프로그램과 연결된 콘솔의 코드페이지를 변경해주어야 한다.
※ SetConsoleOutputCP함수의 보다 자세한 사항은 [여기]를 참고하자.

Example

아래는 '한글테스트'라고 적혀 있는 utf-8로 인코딩 된 파일을 읽어와 출력하는 예제다.

NOTE : 티스토리 코드 블록 버그인지 아래 코드를 그대로 복붙해서 빌드하면 컴파일 에러가 발생하므로 첨부 파일을 다운 받아서 테스트 해보도록 하자.
#include <iostream> #include <fstream> #include <string> #ifdef _WIN32 #include <Windows.h> #endif int main() { #ifdef _WIN32 ​​​​SetConsoleOutputCP(CP_UTF8); #endif ​​​​/** utf8.txt ​​​​한글테스트 ​​​​*/ ​​​​const std::string file_path = "utf8.txt"; ​​​​ ​​​​std::ifstream is(file_path); ​​​​if (true == is.is_open()) ​​​​{ ​​​​​​​​std::string line; ​​​​​​​​while (getline(is, line)) ​​​​​​​​{ ​​​​​​​​​​​​std::cout << line << std::endl; ​​​​​​​​} ​​​​​​​​is.close(); ​​​​} }

Output

위 코드에서 11라인의 SetConsoleOutputCP를 주석 처리하고 컴파일 후 실행 하면 아래와 같은 결과가 출력된다.

?쒓??뚯뒪?

D:\helloworld_cpp\x64\Debug\helloworld_cpp.exe(프로세스 25400)() 종료되었습니다(코드: 0).
이 창을 닫으려면 아무 키나 누르세요...

하지만 다시 주석을 제거하고 실행하게 된다면 아래와 같이 우리가 원하는 결과를 출력함을 볼수 있다.

한글테스트

D:\helloworld_cpp\x64\Debug\helloworld_cpp.exe(프로세스 20852)() 종료되었습니다(코드: 0).
이 창을 닫으려면 아무 키나 누르세요...

NOTE

  • 유닉스 베이스 OS의 콘솔에서는 별다른 처리가 없더라도 UTF-8 텍스트가 깨지지 않고 출력 된다.
  • SetConsoleOutputCP는 윈도우 API다. OS 호환성을 위해서는 _WIN32와 같은 전처리가 필요하다.
  • C++만 이런다. C#은 UTF-8이 잘 출력된다.

부록 1. 같이 읽으면 좋은 글

부록 2. 첨부 파일

main.cpp
0.00MB
utf8.txt
0.00MB

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!