ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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.라고 되어있다.

    반응형
Designed by Tistory.