이번 VScode를 사용하며 겪은 에러이다.. Locale error
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
찾아보니 이미 많은 사람들이 겪고 있던 문제였었고, 나도 쉽게 해결할 것이라고 기대했다. 이건 나의 실패기록이다. 성공하지 못하였고 나는 강의 동안 visual studio로 갈아탈 예정이다.
아래는 내가 에러를 해결하기 위해 시도했던 내용들이다. 다른 누군가에겐 도움이 되었으면 좋겠다.
locale 설정의 문제이다. 해결하기 위해선 locale 을 설치하고 locale을 Korea로 설정해주면된다.
apt-get install locales
locale-gen ko_KR.UTF-8
update-locale LANG=ko_KR.UTF-8
apt-get install locales && dpkg-reconfigure locales
ref : Re: locale::facet::_S_create_c_locale name not valid 에러 해결
하지만 불행히도 나는 window 환경이다.
before
wchar_t wch = L'안'; // 작은따옴표 앞에 'L' 을 넣어서 캐스팅해줘야함.
int main()
{
cout << ch << endl;
cout << ch2 << endl;
cout << ch3 << endl; // b
cout << wch << endl; // 50504 출력 -- wch를 cout에서 인식하지 못해서 생기는 문제
wcout.imbue(locale("kor"));
wcout << wch << endl;
}
after
wchar_t wch = L'안'; // 작은따옴표 앞에 'L' 을 넣어서 캐스팅해줘야함.
int main()
{
cout << ch << endl;
cout << ch2 << endl;
cout << ch3 << endl; // b
cout << wch << endl; // 50504 출력 -- wch를 cout에서 인식하지 못해서 생기는 문제
setlocale(LC_ALL, "");
wcout.imbue(locale(""));
// wcout.imbue(locale("kor"));
wcout << wch << endl;
}
setlocale을 통해서 윈도우가 쓰고있는 locale과 자동으로 일치시키는 작업을 넣었지만 fail...
after2
wchar_t wch = L'안'; // 작은따옴표 앞에 'L' 을 넣어서 캐스팅해줘야함.
int main()
{
cout << ch << endl;
cout << ch2 << endl;
cout << ch3 << endl; // b
cout << wch << endl; // 50504 출력 -- wch를 cout에서 인식하지 못해서 생기는 문제
setlocale(LC_ALL, "Korean_Korea.949");
_wsetlocale(LC_ALL, L"korean");
wcout.imbue(locale(""));
// wcout.imbue(locale("kor"));
wcout << wch << endl;
}
여전히 에러가 발생한다.. 나한테 해당되지 않는 부분이었다.
내 로케일을 확인해봤을때, 나는 정상적으로 C 로케일을 사용중이었다.
확인하는 방법은 아래와 같다.
#include <iostream>
#include <locale>
int main() {
std::locale loc;
std::cout << loc.name() << std::endl;
return 0;
}
만일 C가 출력되지 않는다면 아래 코드를 사용해서 해결하길 바란다
#include <locale>
int main() {
std::locale::global(std::locale("C")); // 또는 다른 올바른 로케일
// 나머지 프로그램 코드
return 0;
}
window
set LC_ALL=C
echo %LANG%
Linux
export LC_ALL=C
echo $LANG
kor이 표준 로케일이 아니어서 발생하는 원인일 수 있다.
아래 코드를 이용하여 표준 locale을 사용해서 해보자
#include <iostream>
#include <locale>
int main() {
// 시스템에서 지원하는 표준 로케일을 사용
std::wcout.imbue(std::locale("ko_KR.UTF-8"));
// 여기에 나머지 코드 추가
return 0;
}
정확힌 표준 locale을 확인 방법
아래 내용을 파워쉘 혹은 터미널에 입력하면 locale의 정확한 표현 방법이 나온다.
linux
locale -a
window
Get-Culture
std::locale::global(std::locale(""));
위 코드만 입력했는데도 locale 에러가 발생한다면 시스템 환경변수를 수정해봐야한다.
echo %LANG%
위 코드를 터미널 또는 파워쉘에 입력하면 시스템의 기본 로케일을 출력한다. ko-KR 등이 출력될 것이다.
하지만 나는 %LANG 이 출력된다. 드디어 원인을 찾았다며 기뻐했다...
아래 코드를 이용하여 다른 방식으로 적용되어있는 지 확인해보자
echo %LC_ALL%
echo %LC_CTYPE%
만일 위 코드를 적용해도 엉망으로 뜬다면 아래 set을 이용해서 적용해보자.(참고로 난 안됐다.) 적용 후에 echo를 이용하여 잘 적용됐는지 확인해보자
set LC_ALL=ko-KR
나는 위 모든 방법이 안됐다.. 코드페이지가 잘못됐을 수도 있다는 얘기를 들었다. 코드페이지를 수정해보자.
chcp 65001
위 코드는 UTF-8 코드페이지로 변경하는 방법이다.
해당 내용을 적용후 set echo를 통해 다시 시도했지만 실패했다.
setting.json을 열어서 해당 내용을 적용해봤다.
1) setting.json을 여는 방법 : F1 클릭 후 Open Settings 링크를 클릭
이후 아래 코드를 setting.json 에 복사해 넣는다.
{
"terminal.integrated.env.windows": {
"LC_ALL": "ko-KR.UTF-8",
"LANG": "ko-KR.UTF-8"
}
}
이후 VScode를 재시작, 또는 code .을 사용해서 재시작한다.
하지만 여전히 echo 에서는 %LANG% 만 보여줬다.. 내가 뭘 잘못한거니..
시스템 환경변수에 LC_ALL, LANG 가 없어서 생긴 문제일 수 있다. 따라서 우리는 환경변수에서 LC_ALL, LANG 두 내용을 추가해주자.
내 PC - 마우스 오른쪽 - 속성 - 환경 변수 - 고급 - 시스템 환경변수 확인 - LC_ALL, LANG 확인
없는 경우 - 새로 만들기 - 컴퓨터 재시작
변수 명 : LC_ALL // 변수 값 : ko-KR.UTF-8
변수 명 : LANG // 변수 값 : ko-KR.UTF-8
파워쉘은 관리자권한으로 해줘야한다. 안그러면 안되는게 많다.
그리고 아래 내용을 직접 입력해준다.
[System.Environment]::SetEnvironmentVariable("LC_ALL", "ko-KR.UTF-8", [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::SetEnvironmentVariable("LANG", "ko-KR.UTF-8", [System.EnvironmentVariableTarget]::Machine)
이후 echo를 통해 다시 했지만 여전히 안됐다.
제어판에 있는 로케일을 수정해보자
제어판 - 국가 또는 지역 - 관리자 옵션 - 유니코드를 지원하지 않는 프로그램용 언어 - 한국
VScode의 터미널 환경이 특정 path 를 가리키거나 설정이 제대로 되어있지 않는 경우에도 이런 에러가 뜰 수 있다고 한다.
ctrl + , 또는 File에서 Preference 선택 후 Settings를 클릭.
터미널 설정에서
Integrated>Cwd or Integreated>Env 를 확인 만일 path가 설정되어 있지 않다면
file - open folder - View menu - new terminal
이후 echo %LANG% 을 해보자. 나는 안됐다.
여기까지가 내가 시도한 11가지 방법이다.
강의를 제대로 따라해보기도 전에 에러를 만났고.. 실패했다. 추후 다른 누군가가 성공했다면 꼭 알려줬으면 좋겠다. 새로운 방법을 언제든지 시도할 준비가 되어있습니다. 살려주세요... 저는 Visual studio 2022 로 떠나지만 누군가 해결했다면 다시 돌아오겠습니다.
내일부턴 다시 강의를 듣고 정리하겠습니다.
-끝-