VS2010中C++实现编码判断,转换

本文介绍了一个用于检测文本编码格式并实现不同编码间转换的方法。通过使用COM组件IMultiLanguage3来检测输入文本的编码类型,如UTF-8或GBK,并提供了从UTF-8到Unicode再转为GB2312的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



//------------------------------判断编码格式------------------------------------------------
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;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值