-
c++ 파일 저장 시 로케일로 인한 깨짐 문제프로그래밍/의문 2016. 7. 5. 10:29반응형
std::wofstream을 통해 한글과 영문, 숫자가 섞인 로그를 기록하려고 했다.
코드>>
std::wofstream of(L"C:\\Users\\user\\Desktop\\test.txt");
of << L"안녕안녕 이건 로그야" << L"abc123" << std::endl;
결과>>
?! 정상적으로 저장하는 것처럼 보였으나 위 이미지처럼 파일 내부가 텅 비어있었다. 잘못된 것이 없다고 생각했기에 더더욱 난감했는데, 검색 결과 locale의 문제로 한글 저장이 안 되는 경우가 있다는 걸 알았고, 그것을 한국어로 설정해야 정상 동작을 한다는 걸 알았다.
std::locale::global( std::locale("Korean") );
std::wofstream of(L"C:\\Users\\user\\Desktop\\test.txt");
of << L"안녕안녕 이건 로그야" << L"abc123" << std::endl;
결과>>
위와 같이 locale을 Korean으로 설정하면 정상적으로 동작되는 걸 확인할 수 있었으나 명시적으로 로케일을 Korean으로 지정하는 것은 뭔가 찜찜했다. 내가 어느 환경에서 실행하던 저 프로그램은 Korean locale로 실행된다는 것이다. 그래서 더 알아보니, 시스템이 사용하는 로케일로 설정을 하는 것이 있다고 하더라.
setlocale(LC_ALL, ""); 그런데 이 setlocale 함수는 c에서의 것이고 c++에선 std::locale::global ( std::locale("") ); 로 하면 시스템이 사용하는 로케일로 지정이 된다고 한다.
++
일단 wofstream으로 파일 저장하는 것은 무사히 완료 되었다. 그래서 별 문제가 없을 거라 생각했는데, 이번엔 c#으로 된 프로그램에서 한글 문자열을 읽다가 문제가 발생했다.
코드 >>
FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, UnicodeEncoding.Unicode);
sr.ReadLine() .. ?! 이상한 문자가 읽어지네
위 코드는 StreamReader sr = new StreamReader(fs, UnicodeEncoding.Unicode); 부분을
StreamReader sr = new StreamReader(fs, UnicodeEncoding.Default)로 변경하는 것으로 해결하였으며 아마 Default로 지정 시 시스템이 사용하는 로케일을 사용하는 듯 하다.
++
https://msdn.microsoft.com/en-us/library/system.text.encoding.default(v=vs.110).aspx 에 따르면 An encoding for the operating system's current ANSI code page.라고 되어있다.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
비쥬얼 스튜디오에 tcmalloc 간단 적용 (0) 2016.07.22 c# + sqlite 사용 중 datetime 저장/조회에 발생한 문제 (0) 2016.07.17 InvalidOperationException "No current now" error (0) 2016.06.19 반환된 임시 개체 사용으로 인한 종종 프로그램이 터지던 문제 (0) 2016.06.15 친구와 각자의 집에서 tcp 연결을 하려는데 연결이 안 되던 문제 (0) 2016.04.04