100分求用VC 把JAVA UTF8字符串转成GB2312字符串。如把联通转成联通。
如
CString s="联通";
CString d="联通";
请问如何通过编码转换把s转换成d?能出点子的出点子,能给出源码的请给源码。
谢谢!!!!!
如
CString s="联通";
CString d="联通";
请问如何通过编码转换把s转换成d?能出点子的出点子,能给出源码的请给源码。
谢谢!!!!!
int t;
wchar_t ch;
wstring wstr;
LPTSTR p = s.GetBuffer();
for(;*p != '\0';p += 8)
{
_sntscanf(p,4,"%d",&t);
ch = t;
wstr += ch;
}
s.ReleaseBuffer();
d = wstr.c_str();
这段代码是临时写下来的,只是说明转换原理,可能不正确,而且应该能进一步优化,在这里我使用了stl所以要在文件开头加上
#include <string>
using namespace std;
USES_CONVERSION;
MessageBox(W2A(sz));
CString d="联通";
WORD sz[10]={0};//输出缓冲,可自行加大
bool b16=false;//是否16进制
int nState = 0;//状态机制
int nStart = -1;//初始索引
for(int i=0;i<s.GetLength();++i)
{
switch(s[i])
{
case '&':
nStart ++;
b16=false;
nState = 1;
break;
case '#':
if(nState == 1)
nState = 2;
else
nState = 0;
break;
case 'x':
if(nState==2)
b16=true;
break;
default:
if(!((s[i]>='a'&&s[i]<='z')
||(s[i]>='A'&&s[i]<='Z')
||(s[i]>='0'&&s[i]<='9')))
break;
if(nState==2)
if(b16)
{
sz[nStart]<<=4;
if(s[i]>='a')
sz[nStart]|=s[i]-'a'+10;
else if(s[i]>='A')
sz[nStart]|=s[i]-'A'+10;
else
sz[nStart]|=s[i]-'0';
}
else
{
sz[nStart]*=10;
sz[nStart]+=s[i]-'0';
}
}
}
USES_CONVERSION;
MessageBox(W2A(sz));
USES_CONVERSION
W2A
应引用哪个头文件啊?
MSDN装不上。
给你一个函数
CString Convert(CString str, int sourceCodepage, int targetCodepage)
{
int len=str.GetLength(); int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0); wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen); BYTE * pTargetData;
int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt;
rt.Format("%s",pTargetData);
delete pUnicode;
delete pTargetData;
return rt;}
UTF8到GB2312的用法
Convert(str,CP_UTF8,936);