现在手上有个字符串"\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"
如何变成 "物流 公司 mailto"

解决方案 »

  1.   

    CString str( "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto" );
    str.Replace( "%20", " " ) ;
    TRACE( "%s\n", str ) ;
      

  2.   

    用什么编码
    我也在处理中文的问题,使用UNICODE
    确实很多想不到的现象
    你最好把代码贴出来看看
      

  3.   

    楼上,str.Replace( "%20", " " ) ;含义是????
      

  4.   

    str.Replace( "%20", " " );
    目的是为了替换空格
    因为%20的UNICODE解码就是空格的意思
      

  5.   

    CString CTest6Dlg::WebStr2Str(LPCSTR lpBuf)
    {
    int nLen; if( !lpBuf )
    nLen = 0;
    else
    nLen = ::lstrlen(lpBuf); CString s;
    int i = 0;
    while( i < nLen )
    {
    if( lpBuf[i] == '%' )
    {
    BYTE c1=lpBuf[i+1];
    BYTE c2=lpBuf[i+2];
    i+=2; if(c1>='0' && c1<='9')
    c1 = (c1-'0')*16;
    else 
    if(c1>='A' && c1<='Z')
    c1 = (c1-'A'+10)*16;
    else 
    if(c1>='a' && c1<='a') 
    c1 = (c1-'a'+10)*16; if(c2>='0' && c2<='9')
    c2 = c2-'0';
    else 
    if(c2>='A' && c2<='Z')
    c2 = c2-'A'+10;
    else 
    if(c2>='a' && c2<='z')
    c2 = c2-'a'+10; char szStr[2];
    szStr[0] = c1+c2;
    szStr[1] = 0;
    s += szStr;
    }
    else 
    if( lpBuf[i] == '+' )
    s+=" ";
    else 
    s+=CString(&lpBuf[i],1); i++;
    }
    return s;
    }CString str1 = WebStr2Str("\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto");
      

  6.   

    "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"
    这个字符串就是“物流%20公司%20mailto“
    所以只需将%20替换为空格就满足你的需求了。因此一楼的就可以了。不用象小三这么复杂
      

  7.   

    把\x去掉,然后把生成的buffer,调用WideCharToMultiByte
      

  8.   

    哦,这个不是unicode,就把\x去掉就好了
      

  9.   

    有点儿麻烦,你自己提炼吧
    void convertstr(char *out, const char *in)
    {
    char dest[1024];
    memset(dest, 0, 1024);

    int sz = strlen(in); char ch;
    int len = 0, hi, li; for(int i = 0; i < sz; i++)
    {
    if(in[i] >= 'A' && in[i] <= 'Z') //A-Z
    {
    dest[len] = in[i];
    len += 1;
    }
    else if(in[i] >= 'a' && in[i] <= 'z') //a-z
    {
    dest[len] = in[i];
    len += 1;
    }
    else if(in[i] >= '0' && in[i] <= '9') //0-9
    {
    dest[len] = in[i];
    len += 1;
    }
    else if(in[i] == '-' || in[i] == '_' || in[i] == '.' //reserve
    || in[i] == '!' || in[i] == '~' || in[i] == '*' 
    || in[i] == '\\' || in[i] == '(' || in[i] == ')'
    || in[i] == '/' || in[i] == ':')
    {
    dest[len] = in[i];
    len += 1;
    }
    else if(in[i] == '%' && in[i+1] == '2' && in[i+2] == '0')
    {
    dest[len] = ' ';
    len += 1;
    i += 2;
    }
    else if((in[i] == '\\') && ((in[i + 1] == 'x') || (in[i + 2] == 'X')))
    { //先将%e4中的e4转化成数值
    ch = in[i + 2];
    if(ch >= 97 && ch <= 102)
    hi = 10 + (ch - 97);
    else if(ch >= 65 && ch <= 70)
    hi = 10 + (ch - 65);
    else
    hi = atoi(&ch); hi = hi << 4; ch = in[i + 3];
    if(ch >= 97 && ch <= 102)
    li = 10 + (ch - 97);
    else if(ch >= 65 && ch <= 70)
    li = 10 + (ch - 65);
    else
    li = atoi(&ch); int ret = hi + li; dest[len] = ret; len += 1;
    i += 2;
    }
    else //已经是汉字的不做转换,防止2次解码出问题
    {
    dest[len] = in[i];
    len += 1;
    }
    }

    dest[len] = '\0';
    memcpy(out, dest, strlen(dest));
    }void main()
    {
    char result[1024];
    memset(result, 0, 1024);
    const char *sam = "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"; convertstr(result, sam); printf(result); system("pause");
    }
      

  10.   

    len是输出字符串的长度,你可以返回