[C++] 유니코드 문자열을 파일에 쓰는 방법
예전에 만들었던 파일에 로그를 남기던 라이브러리를 재사용을 하려고 하는데 출력 내용을 보니 한글은 깨져 있고 영어도 문자 사이사이에 공백이 들어가 있더군요. 생각해보니 모든 코드를 유니코드 버전으로 변경하였는데 파일 관련 내용에 대해서는 고려하지 못했던거 같습니다.
텍스트 파일을 유니코드로 인식하는 방법은 의외로 간단합니다. 파일의 처음 부분에 0xFEFF 의 값을 기록하면 해당 파일이 유니코드로 작성된 파일인지 여부를 판가름하게 됩니다.
아래에 예제소스를 첨부합니다.
ANSI 버전
int main( void )
{
wchar_t* english = L"English";
wchar_t* linefeed = L"\r\n";
wchar_t* korean = L"한글";
HANDLE handle = ::CreateFileW( L"Unicode.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, NULL);
DWORD numberOfBytesWritten;
int result;
result = ::WriteFile(handle, english, wcslen(english)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
result = ::WriteFile(handle, linefeed, wcslen(linefeed)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
result = ::WriteFile(handle, korean, wcslen(korean)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
return 0;
}
UNICODE 버전
int main( void )
{
wchar_t* english = L"English";
wchar_t* linefeed = L"\r\n";
wchar_t* korean = L"한글";
unsigned short mark = 0xFEFF;
HANDLE handle = ::CreateFileW( L"Unicode.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, NULL);
DWORD numberOfBytesWritten;
int result;
result = ::WriteFile(handle, &mark, sizeof(mark), &numberOfBytesWritten, NULL);
result = ::WriteFile(handle, english, wcslen(english)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
result = ::WriteFile(handle, linefeed, wcslen(linefeed)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
result = ::WriteFile(handle, korean, wcslen(korean)*sizeof(wchar_t), &numberOfBytesWritten, NULL);
return 0;
}
|