IT/C/C++
유니코드&UTF8 텍스트를 파일로 저장하기
mynotepad1
2009. 3. 6. 20:41
Unicode 형식 및 UTF8 형식의 텍스트로 저장하는 방법
CFile p;
CString tempStr;
CString FileName=_T("C:\\Download.log");
p.Open(FileName, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate);
p.SeekToEnd();
TCHAR szTmp[2];
WORD wd = 0xfeff;
memcpy(szTmp, &wd, 2);
p.Write(szTmp, 2);
p.Write(m_sUrl, m_sUrl.GetLength()*sizeof(TCHAR) );
p.Write(_T("\n"),1*sizeof(TCHAR));
p.Close();
CString tempStr;
CString FileName=_T("C:\\Download.log");
p.Open(FileName, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate);
p.SeekToEnd();
TCHAR szTmp[2];
WORD wd = 0xfeff;
memcpy(szTmp, &wd, 2);
p.Write(szTmp, 2);
p.Write(m_sUrl, m_sUrl.GetLength()*sizeof(TCHAR) );
p.Write(_T("\n"),1*sizeof(TCHAR));
p.Close();
여기서 핵심은 FEFF 이다.
유니코드의 식별자란 것인데, 파일의 처음부분에 넣어주면 유니코드라고 선언하는 셈이 된다.
(원래 규격은 FFFE 일것이지만, IBM PC 는 리틀엔디언 방식이므로 바이트 위치를 반대로 두어야 한다.)
//UTF-8 로 저장하기
int UnicodeToUtf8(TCHAR* pUnicode, char** pUtf8)
{
int len = ::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, NULL, 0, NULL, NULL);
*pUtf8 = new char[len];
::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, *pUtf8, len, NULL, NULL);
return len;
}
// UTF 0xEFBBBF
TCHAR szTmp[2];
WORD wd = 0xbbef;
memcpy(szTmp, &wd, 2);
file.Write(szTmp, 2);
BYTE byte = 0xbf;
memcpy(szTmp, &byte, 1);
file.Write(szTmp, 1);
char *pUtf8 = NULL;
nLen = UnicodeToUtf8(szXML, &pUtf8);
file.Write(pUtf8, nLen-1);
delete []pUtf8;
int UnicodeToUtf8(TCHAR* pUnicode, char** pUtf8)
{
int len = ::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, NULL, 0, NULL, NULL);
*pUtf8 = new char[len];
::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)pUnicode, -1, *pUtf8, len, NULL, NULL);
return len;
}
// UTF 0xEFBBBF
TCHAR szTmp[2];
WORD wd = 0xbbef;
memcpy(szTmp, &wd, 2);
file.Write(szTmp, 2);
BYTE byte = 0xbf;
memcpy(szTmp, &byte, 1);
file.Write(szTmp, 1);
char *pUtf8 = NULL;
nLen = UnicodeToUtf8(szXML, &pUtf8);
file.Write(pUtf8, nLen-1);
delete []pUtf8;
UTF-8 도 마찬가지로 헤더를 조작하는데, 이번엔 3바이트짜리 0xEFBBBF 헤더를 파일 앞에 써 놓았다.
UTF-8 도 마찬가지로 헤더를 조작하는데, 이번엔 3바이트짜리 0xEFBBBF 헤더를 파일 앞에 써 놓았다.
출처 : http://sonbosun.tistory.com/7