2016/10/04

Write and read unicode test using wfstream

fstream을 이용하여 유니코드 문자를 저장하려 시도하였다. 쉽게 "w"만을 붙여서 wofstream을 이용하고 wchar_t 또는 wstring을 출력만 하면 될 줄 알았으나 기대대로 동작을 하지 않았다. 문자열 인코딩 문제등등 여러가지 복잡한 문제가 있었다. 여러 정보를 취합해 나중에 도움이 될 수 있도록 코드를 남겼다.

class Unicodecvt : public std::codecvt<wchar_t, char, mbstate_t>
{
protected:
 virtual bool do_always_noconv() const
 {
  return true;
 }
};

// Writting
std::wofstream fOut(L"D:\\test.txt", std::ios_base::binary);
fOut.imbue(std::locale(std::locale(""), ::new Unicodecvt));
fOut << wchar_t(0xFEFF);  // write BOM (UTF-16LE)
fOut << L"유니코드 출력 테스트: " << 12345 << std::endl;
fOut.close();

// Reading
std::wifstream fIn(L"D:\\test.txt", std::ios_base::binary);
fIn.imbue(std::locale(std::locale(""), ::new Unicodecvt));
if ( fIn.is_open() )
{
 fIn.seekg(2); // Skip BOM
 while ( !fIn.eof() )
 {
  wchar_t wszBuf[1024] = { 0, };
  fIn.getline( (wchar_t*)wszBuf, _countof(wszBuf));
 }
}
fIn.close();


참조 문서
https://golbenge.wordpress.com/2009/12/24/stl을-이용한-unicode-텍스트-파일-출력 http://saneh.tistory.com/entry/STL-유니코드-저장읽기

No comments :

Post a Comment