int CheckEncodingType(CString strPage)
{
//////////////////////////////////////////////////////////////////////////
//
// Function : CheckEncodingType
// Param : LPCTSTR lpFilelocation 파일의 저장위치
// Return : integer; 0 = ANSI
// 1 = UTF-8
// 2 = Unicode LE
// 3 = Unicdoe BE
// -1 = File Error
//
// description : 텍스트의 인코딩 형식을 찾아 리턴한다
int nRet = 0;
BYTE btBuf[8];
memset(btBuf, 0, 8);
//BOM 정의
BYTE btBOM_UnicodeBE[] = {0xFE, 0xFF};
BYTE btBOM_UnicodeLE[] = {0xFF, 0xFE};
BYTE btBOM_UTF8[] = {0xEF, 0xBB, 0xBF};
//3바이트이상
if(strPage.GetLength() < 3)
return -1;
if(memcmp(btBuf, btBOM_UnicodeLE, 2) == 0) //Unicode Little Endian
{
nRet = 2;
return nRet;
}
else if(memcmp(btBuf, btBOM_UnicodeBE, 2) == 0) //Unicode Big Endian
{
nRet = 3;
return nRet;
}
else if(memcmp(btBuf, btBOM_UTF8, 3) == 0) //UTF-8
{
nRet = 1;
return nRet;
}
// ANSI와 UTF-8을 노가다로 판단하는 루틴
memset(btBuf, 0, 8);
int nLookNum = 0; // 이후 출현할 바이트 개수값
int nRead = 0;
int nANSINum = 0;
for (int i=0; i<strPage.GetLength(); i++)
{
btBuf[0] = strPage.GetAt(i);
nRead++;
//7F (=127)보다 작은 경우는 패스
if(btBuf[0] <= 0x7F && nLookNum == 0)
{
nANSINum++;
continue;
}
//FF, FE일 경우는 UTF-8이 될 수 없다.
else if((btBuf[0] == 0xFF || btBuf[0] == 0xFE) && nLookNum == 0)
{
return 0;
}
//7F보다 큰경우 UTF-8 판단작업 들어감
else
{
if(nLookNum > 0) //내부 검사
{
nLookNum--;
if(btBuf[0] >= 0x80 && btBuf[0] <= 0xBF)
continue;
else
return 0; //ANSI 리턴
}
else //최외각 검사
{
if(btBuf[0] >= 0xC0 && btBuf[0] <= 0xDF) nLookNum = 1;
else if(btBuf[0] >= 0xE0 && btBuf[0] <= 0xEF) nLookNum = 2;
else if(btBuf[0] >= 0xF0 && btBuf[0] <= 0xF7) nLookNum = 3;
else if(btBuf[0] >= 0xF8 && btBuf[0] <= 0xFB) nLookNum = 4;
else if(btBuf[0] == 0xFC || btBuf[0] == 0xFD) nLookNum = 5;
else nANSINum++;
continue;
}
}
}
if(nRead != nANSINum) nRet = 1;
else nRet = 0;
return nRet;
}
'개발지식창고 > MFC' 카테고리의 다른 글
현재모듈 실행 경로 얻어오기 (0) | 2010.07.28 |
---|---|
윈도우 최상위 윈도우로 끌어 올리기 (0) | 2010.07.28 |
[문자열처리] CString -> char* , char* -> CString 변환 (0) | 2010.07.28 |
CView -> CScrollView로 전환 (0) | 2010.07.27 |
CSplitterWnd에 아무 윈도우나 넣자 (0) | 2010.07.20 |