[WIN32] 멀티바이트가 아닌 인코딩된 문자열을 콘솔에 표시할 때 Lu's…〃 Programing。

최근, char*로 반환되는 문자열의 인코딩이 UTF-8인 경우를 맞딱뜨렸다. 이걸 UTF-8 인코딩 된 파일로 저장해서 읽으면 잘 읽어지는데 콘솔로 출력하니 인코딩이 깨지더라.

std::ios는 imbue라는 locale 설정 함수가 있다. 이를 상속받은 std::ostream, std::cout 등도 동일한 함수가 있고 이를 사용하면 ios에 들어간 데이터를 해당 로케일로 인코딩하여 보여준다. 그런데 이게 안 되더라!

  char* recv_msg; // char*로 반환된 UTF-8 문자

  std::cout.imbue(std::locale{ "ko_KR.UTF-8" }); // 한글 UTF-8 인코딩
  std::cout << recv_msg << std::endl;

이런 식으로 코딩하면 안 나온다!



 한참만에 이리 뒤지고 저리 굴러서 정답을 알아냈는데, 일단 어떻게 굴렀는지를 얘기해본다. 참고로 다 실패했다.

1. recv_msg를 wchar_t, char16_t, char32_t 등으로 형변환하여 읽어 봄
2. imbue 말고 setlocale 사용
3. codecvt_utf8 등을 이용하여 utf-8 문자로 강제 변환

이렇게 해도 안 되던 걸 어느 사이트에서 해답을 찾았는데, Win32 함수이다.

  SetConsoleOutputCP(CP_UTF8);

함수를 호출하니 잘 되더라. 이 함수는 Console Output의 코드페이지(CP)를 설정하는 함수인데, char*라지만 이미 UTF-8 인코딩이 된 문자열이었기 때문에 Console Output의 CP만 바꾸면 되지 않았나 싶다.

 정확히는 아직도 모르겠다. 정답을 아시는 분은 부디 댓글로 남겨주세요...



덧글

댓글 입력 영역