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 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?