URL的UTF-8 decode

#pragma warning(disable:4996)
//不显示控制台  那个改成窗口 系统里面的子系统改成窗口
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
#include<atlstr.h>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<iostream>
#include<stdlib.h>
#include<windows.h>

using namespace std;
#define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))

//urf8编码字符串处理 
WCHAR* Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR* buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);//映射一个字符串到一个宽字符
    //1.指定执行转换的多字节字符所使用的字符集   2.一组位标记,一般不用为0 3.指向 待转换的字符串的缓冲区 
    //4.指定由参数 lpMultiByteStr指向的字符串中字节的个数。可以设置为-1,会自动判断lpMultiByteStr指定的字符串的长度
    //5.指向 接收被转换字符串的缓冲区
    //6.指定由参数 lpWideCharStr指向的缓冲区的宽字节数。若此值为0,函数不会执行转换,而是返回目标缓存lpWideChatStr所需的宽字符数。
    buf = new WCHAR[length + 1];
    ZeroMemory(buf, (length + 1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);
    return buf;
}

//url编码字符串解码函数 
WCHAR* UrlDecode(LPCTSTR url) //const wchar_t *
{
    _ASSERT(url);//它的条件返回错误,则终止程序执行。
    USES_CONVERSION; // USES_CONVERSION它是在堆栈上分配空间的
    LPSTR _url = T2A(const_cast<LPTSTR>(url)); //char* C消失了...表示常量... //CString ==> char*
    int i = 0;
    int length = (int)strlen(_url);
    CHAR* buf = new CHAR[length];
    ZeroMemory(buf, length);
    LPSTR p = buf;
    char tmp[4];
    while (i < length)
    {

        if (i <= length - 3 && _url[i] == '%' && IsHexNum(_url[i + 1]) && IsHexNum(_url[i + 2]))
        {
            memset(tmp, 0, sizeof(tmp));
            memcpy(tmp, _url + i + 1, 2);
            sscanf(tmp, "%x", p++);
            i += 3;
        }
        else
        {
            *(p++) = _url[i++];
        }
    }
    return Utf8ToStringT(buf);
}

int main(int argc,char *argv[])
{
    setlocale(LC_ALL, "");
    for (int i = 0; i < argc; i++)
    {
        //cout << argv[i] << endl << endl;
        if(i == 1)
        {
            WCHAR p[1000];
            swprintf(p, 1000, L"%hs", argv[1] + 8);
            WCHAR *proW = UrlDecode(LPCTSTR(p));
            //wprintf(L"%ls

", proW);
            char callEXE[2000];
            sprintf(callEXE, "%ws", proW);
            //cout << callEXE << endl;
            WinExec(callEXE, SW_HIDE);
        }
    }
    return 0;
}

 参考来自:https://blog.csdn.net/kissing7/article/details/76684085?utm_medium=distribute.wap_relevant.none-task-blog-baidujs_baidulandingword-1 这边还有encode

原文地址:https://www.cnblogs.com/Galesaur-wcy/p/14849713.html