pingkai1217 2016-03-21 06:15 采纳率: 41.7%
浏览 2027
已采纳

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

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

  • 写回答

2条回答

  • pingkai1217 2016-03-21 08: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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机