//------------------------------判断编码格式------------------------------------------------
int CMainFrame::checkCodeType(char* pText,DWORD nLength)
{
CoInitialize(NULL);
{
IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC);
// char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB };
char* database = new char[nLength];
database=pText;
int isize = sizeof(database);
DetectEncodingInfo result[32];
int result_count = sizeof(result) / sizeof(result[0]);
HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, database, &isize, result, &result_count);
if (!SUCCEEDED(hr))
{
fprintf(stderr, "Failed with 0x%x\n", hr);
CoUninitialize();
return hr;
}
for (int i = 0; i < result_count; i++)
{
WCHAR desc[100] = {0};
pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100);
if(desc[0]=='U')
{
cFlag=2; //utf-8
return cFlag;
}else if(desc[0]=='C')
{
cFlag=1; //gbk
return cFlag;
}
}
}
CoUninitialize();
return cFlag;
}
//--------------------------------------------------------
void CMainFrame::UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
char* uchar = (char *)pOut;
uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
return;
}
void CMainFrame::UnicodeToGB2312(char* pOut,wchar_t uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
return;
}
void CMainFrame::UTF_8ToGB2312(char* pOut, char *pText, DWORD pLen)
{
//char * newBuf = new char[pLen];
char * newBuf =pOut;
char Ctemp[2]; //4
memset(Ctemp,0,2);//4
int i =0;
int j = 0;
while(i < pLen)
{
if(pText <0)
{
newBuf[j++] = pText[i++];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(&Wtemp,pText + i);
UnicodeToGB2312(Ctemp,Wtemp);
newBuf[j] = Ctemp[0];
newBuf[j + 1] = Ctemp[1];
i += 3;
j += 2;
}
}
newBuf[j] =' ';
pOut = newBuf;
// delete []newBuf;
return;
}