我有一个变量CString str;对str进行utf-8编码,str结果如下:“鏉備釜浜嗗緱鍝燂紝鏁翠簡涓”然后定义一个新的变量CString myurl;myurl = str + "&sss";
myurl的值为“鏉備釜浜嗗緱鍝燂紝鏁翠簡涓?sss”
请问为什么会出现“?”?
如果把代码改成 myurl = "&sss" + str;那么就完全正确。
请问错误在什么地方??

解决方案 »

  1.   

    CString默认是ascii显示
    你把utf8和ascii混编,不错才怪
    把&sss放在前面,还是错的
      

  2.   

    "sss"用utf8编码的话,就是 0 's' 0 's' 0 's',CString在ASCii编码的方式下,遇到0就认为是结束了你想把这些写入文件呢,还是要显示? 
      

  3.   

    我要拼接url地址,然后把这个url用get的方式发送到服务器
      

  4.   

    UTF8 to ansi:const int BUF_SIZE=1024;
    WCHAR szUnicode[BUF_SIZE];
    char szAnsi[BUF_SIZE];nWCHAR=MultiByteToWideChar(CP_UTF8,0,szUTF,nSize,szUnicode,BUF_SIZE);
    nSize=WideCharToMultiByte(CP_ACP,0,szUnicode,nWCHAR,szAnsi,BUF_SIZE,NULL,NULL);
      

  5.   

    我现在是这样的,我偶一个中英文混合的内容,我要用 utf-8编码,然后用get方式做为 
    url参数,上传到服务器。但是因为多了一个 ‘?’造成url错误!
      

  6.   

    5楼的代码你试过了吗?
    const   int   BUF_SIZE=1024; 
    WCHAR   szUnicode[BUF_SIZE]; 
    char   szAnsi[BUF_SIZE];
           strcpy(szAnsi,"这里是你要转换成utf8的中英文混合字串"); nWCHAR=MultiByteToWideChar(CP_UTF8,0,szUTF,nSize,szUnicode,BUF_SIZE); 
      

  7.   

    我的转换代码如下:
    CString CHttpSend::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 = NULL; 
    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;
    }转换本身没有问题,我要问的是,为什么和 “&sss”相加,就多了一个问号??
    大家可以按我说的测试,肯定有。因为最后我要拼成一个url字符串,发到服务器!希望大家看懂我的疑难所在!谢谢
      

  8.   

    如果是这个问题,那只能网站那边处理了,或者看它是否支持其他编码格式你用ascii的方式去阅读utf8,所以才会出现这种情况,这个无法改变,除非换一种编码方式
      

  9.   

    vc6能否该成utf-8的默认编码呢??
      

  10.   

    可以的,需要定义UNICODE宏,不过具体还有什么细节你在网上再查查吧,我没有做过
      

  11.   

    定义了unicode还是不行各位,大家都没有用过么??
      

  12.   

    vc默认的是ascII编码,你可以先把unicode的编码转成ascII,连接之后再转回unicode
      

  13.   

    我怀疑我的编码和解码函数出错了! 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); 

    CString tempstr;

    tempstr.Format("%s",pUnicode);
    BYTE * pTargetData = NULL; 
    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;这个是转换函数
      

  14.   

    编解码没有问题,问题是你utf8编码后的值不能做为字符串。要想字符串的话就加一个base64编码。这样的话你在服务器端也要做相应的解码工作
      

  15.   

    第一、服务器端不是我做的,是别人做的,不可能加base64编码
    第二、我觉得编码是有问题的。因为比如一句话:“你是我的好朋友” 有些算法编码出来是:“浣犳槸鎴戠殑濂芥湅鍙” 
    有些算法编码出来是:“浣犳槸鎴戠殑濂芥湅鍙嬪” 这些都是可以反回去的。
    我的编码编出来是第一种。
    所以我认为编码有问题
      

  16.   

    不是多了问号,asc编码中每个字符的长度是不定的,unicode中是固定的,你把“&sss”放在前面,按照asc码打印出来,“&sss”因为采用的就是asc编码,所以解释正确,之后跟着的Unicode也按照asc码解释,所以全是乱码,最后碰到结束符(0x00)结束。当“&sss”放到Unicode的后面,“&”被与前面的字符结合起来解释,所以变成了“?”
      

  17.   

    to llg84:请问怎么处理??怎么解决呢??
      

  18.   

    你为什么要在unicode字串基础上加上一个“&sss”的asc字串呢?两者不能使用同样的编码么?服务器端如何处理这个asc字串?是先分离出来么?
      

  19.   

    我要拼url地址,参数是这样的,我没有法子改变还有,我先拼接,再把整个地址集体转utf-8编码,还是有同样的问题。当中文字符为偶数的时候,是没有‘?’的。这个时候,我把这个url发送到服务器端,解析完全正常。所以我现在的问题是,怎么处理掉这个‘?’。
      

  20.   

    我的编码上面已经帖出来了
    测试很简单,编码出来和"&sss"这个字符串相加,没有'?'就是正确的。
    void CHttpSend::ConvertGBKToUtf8(CString& strGBK) 
    {
        int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
        unsigned short * wszUtf8 = new unsigned short[len+1];
        memset(wszUtf8, 0, len * 2 + 2);
        MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);
        len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 
        char *szUtf8=new char[len + 1+2];
        memset(szUtf8, 0, len + 1+2);
        WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len+1, NULL,NULL);    strGBK = szUtf8;
        delete[] szUtf8;
        delete[] wszUtf8;
    }测试如下:
    CString strcontent = "你是我的好朋友";ConvertGBKToUtf8(CString& strcontent); //编码CString url = "http://www.csdn.net?content="+ strcontent+"&sss=123";如果url合法,就对了。如果strcontent+"&sss"  之间出现‘?’,这个url就不合法了。你也可以试试先拼接字符串,再编码注意: 偶数个汉字是正确的。奇数个汉字才会出现哪个“?” 
      

  21.   

    你是在本地显示时出现了“?”还是传过去的时候服务器端出了错?如果服务器端的codepage是CP_UTF8,应该不会出现这个问号才对
      

  22.   

    我传不过去啊。url错误啊,url不合法呀哎
      

  23.   

    囧......哪儿检查的url是否正确?那个问号我认为纯粹是系统解码错误造成的.....
      

  24.   

    是啊,是编码造成的啊。哪儿检查都不正确啊。这个跟那里检查无关。url非法就是非法。问题是怎么解决??
    现在的条件就这样子的。其他我无法控制。我的url必须正确。否则会返回参数错误!有两个'?' 当然有参数错误了
      

  25.   

    呃。。我转换然后打印出来就有一个“?”,是“浣犳槸鎴戠殑濂芥湅鍙?”,然后转换回去,还是“你是我的好朋友”,应该和单数偶数个汉字没有关系吧。我觉得就是编码显示的问题,你的编解码函数没问题。至于怎么避免传递的时候不能带有多个“?”而且不能base64,我还是看下面大牛的吧