2 pingkai1217 pingkai1217 于 2016.03.21 14:15 提问

MFC URL编码 含有中文编码问题求解

程序里需要通过URL传递参数,里面如果有中文的话就变成?????,程序设置为多字节。
求一个可以用的 URL编码例子

2个回答

pingkai1217
pingkai1217   2016.03.21 16:04
已采纳

自己解决了 转化例子

 void UnicodeToUTF_8(char* pOut, WCHAR* pText)
{
    // 注意 WCHAR高低字的顺序,低字节在前,高字节在后 
    char* pchar = (char *)pText;
    pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
    pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
    pOut[2] = (0x80 | (pchar[0] & 0x3F));
    return;
}

void GB2312ToUTF_8(CString& pOut, char *pText, int pLen)
{
    char buf[4];
    memset(buf, 0, 4);
    pOut.Empty();
    int i = 0;
    while (i < pLen)
    {
        //如果是英文直接复制就可以 
        if (pText[i] >= 0)
        {
            char asciistr[2] = { 0 };
            asciistr[0] = (pText[i++]);
            pOut.Append(asciistr);
        }
        else
        {
            WCHAR pbuffer;
            Gb2312ToUnicode(&pbuffer, pText + i);
            UnicodeToUTF_8(buf, &pbuffer);
            pOut.Append(buf);
            i += 2;
        }
    }
    return;
}
void Gb2312ToUnicode(WCHAR* pOut, char *gbBuffer)
{
    ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gbBuffer, 2, pOut, 1);
    return;
}
CString UrlUTF8(char * str)
{
    CString tt;
    CString dd;
    GB2312ToUTF_8(tt, str, (int)strlen(str));
    size_t len = tt.GetLength();
    for (size_t i = 0; i<len; i++)
    {
        if (isalnum((BYTE)tt.GetAt(i)))
        {
            char tempbuff[2] = { 0 };
            sprintf(tempbuff, "%c", (BYTE)tt.GetAt(i));
            dd.Append(tempbuff);
        }
        else if (isspace((BYTE)tt.GetAt(i)))
        {
            dd.Append("+");
        }
        else
        {
            char tempbuff[4];
            sprintf(tempbuff, "%%%X%X", ((BYTE)tt.GetAt(i)) >> 4, ((BYTE)tt.GetAt(i)) % 16);
            dd.Append(tempbuff);
        }
    }
    return dd;
}
qq_34320560
qq_34320560   2016.03.21 14:23

将参数中的中文内容base64编码,然后再传输,在服务端再进行解码,这样就不会乱码了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!