1. Intro
 테스트로 작성한 프로그램을 여러 OS에서 제대로 작성하는지 테스트 해야했다.
해당 OS에서 많은 문자열을 뽑아서 확인해야 했는데 OS마다 Visual Studio 를 설치
해서 디버깅할 수는 없고, 텍스트 파일로 만들다 보니 한글 출력에 문제가 있었다.
자료를 검색해 봤는데 유니코드를 파일에 쓸 때 몇가지 주의해야 할 점이 있었다.
완벽하게 이해한 것은 아니지만 정리해 본다.


2. 문제 의식
  개발 언어 : C++,MFC
  개발 도구 : Visual Studio 2008 SP1

 CFile 클래스를 이용하여 "log.txt" 파일을 만들었다. 해당 파일에 문자열을 입력하였는데
한글은 깨져서 출력 되었다.



3. 유니코드 문자를 텍스트 파일로 저장할 때 주의해야 할점
- 파일에 유니코드를 관리할 때 바이너리 모드르 다루어야 한다.
- 유니코드 텍스트파일의 첫 헤더의 경우 일반 아스키 텍스트파일과 틀리다.
  : 즉, 파일의 첫 부분에 16진수 0xFEFF 를 기록해야 해당 파일이 유니코드로 작성된 텍스트 파일임을
    시스템이 파악한다.
    cf) 플랫폼 별로 Big-Endian 시스템에서는 0xFEFF 를 기록하고,  Little-Endian 시스템 에서는 0xFFFE 를 기록한다.
         윈도우 메모장은 이 두가지 형식을 다 지원하므로 어떤 값을 기록해도 유니코드로 인식하며, 파일을 읽을 수 있다.


4. 예제 소스
FILE *file = _wfopen(L"test.txt", L"wb");
WORD mark = 0xFEFF;
fwrite(&mark, sizeof(WORD), 1, file);
fwprintf(file, L"123 가나다");
fwprintf(file, L"라마바 456\n");
fclose(file);


---- MFC 에서
// 파일 입출력을 편하게 할 수 있게 CArchive 를 생성한 파일 포인터와 연결 시켰다.
// CArchive 는 정수, 문자열 등의 값을 파일에 쉽게 쓸 수 있도록 여러 멤버 함수를 지원한다.
CFile file;
file.Open(_T("EventLog.txt"), CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
WORD mode = 0xFEFF;
ar.Write(&mode, sizeof(DWORD));
CString str = _T("------- EvtQuery succeeded -------------\r\n");
ar.WriteString(str);
ar.Close();
// 기타 파일에 쓰는 작업
file.Close();


5. 출력 예



6. 기타 주의할 점
Windows 와 Linux 는 개행 문자 처리를 다르게 한다.
Windows 의 개행은 "\r\n" 두 문자로 처리되며,
Linux 의 개행은 "\r" 로 처리 된다.

Windows 에서 파일에 문자를 쓸 때 개행을 하려면 "\r\n" 을 입력해 주어야 한다.


7. 참고 웹페이지
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=245619&ref=245619
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=686955&ref=686955
http://xenostudy.tistory.com/76
Posted by six605
,