100分求用VC 把JAVA UTF8字符串转成GB2312字符串。如把联通转成联通。

CString s="联通";
CString d="联通";
请问如何通过编码转换把s转换成d?能出点子的出点子,能给出源码的请给源码。
谢谢!!!!!

解决方案 »

  1.   

    如果字符串都是中文,可以这样做:
    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;
      

  2.   

    不好意思,有一点写错了,_sntscanf(p,4,"%d",&t);这一句%d应该改成 %X
      

  3.   

    WORD sz[]={0x8054,0x901A,0};
    USES_CONVERSION;
    MessageBox(W2A(sz));
      

  4.   

    用MultiByteToWideChar和WideCharToMultiByte就可以,这两个函数支持绝大部分的编码转换
      

  5.   

    CString s="&#32852;&#x901A;";
    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));
      

  6.   

    谢谢各位
    USES_CONVERSION
    W2A
    应引用哪个头文件啊?
    MSDN装不上。
      

  7.   

    MultiByteToWideChar/WideCharToMultiByte
    给你一个函数
    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);
      

  8.   

    >应引用哪个头文件啊?#include <afxconv.h>