urlurl u r l 不能出现中文,导致不能传输中文数据,解决方法有下面两个:

  • 统一使用 base64base64 b a s e 6 4 转换一下;
  • 把中文用UTF-8存储,然后对其进行可视化编码,这也是浏览器的做法。

先来看下,一条 urlurl u r l 在浏览器中会被转化成什么样,可以用在线的网址转一下。

  • before https://blog.csdn.net/FlushHip?type=1&name=老王&str={}%
  • after https://blog.csdn.net/FlushHip?type=1&name=%E8%80%81%E7%8E%8B&str=%7B%7D%25

可以看到,把UTF-8中的每个字节十六进制可视化出来,然后在前面加上 % 就好了;

由于ASCII和UTF-8是兼容的(第一个字节的最高位是0),因此,大部分ASCII不用转换,当然,少数的ASCII是需要转换的,这里把所有的ASCII可视字符都用在线的网址转一下,得到下列字符是需要转化的: "%<>[]^_` {|}

因此,可以写出下列代码

struct UTF8Url
    static std::string Encode(const std::string & url);
    static std::string Decode(const std::string & url);
private:
    static const std::string & HEX_2_NUM_MAP();
    static const std::string & ASCII_EXCEPTION();
    static unsigned char NUM_2_HEX(const char h, const char l);
const std::string & UTF8Url::HEX_2_NUM_MAP()
    static const std::string str("0123456789ABCDEF");
    return str;
const std::string & UTF8Url::ASCII_EXCEPTION()
    static const std::string str(R"("%<>[\]^_`{|})");
    return str;
unsigned char UTF8Url::NUM_2_HEX(const char h, const char l)
    unsigned char hh = std::find(std::begin(HEX_2_NUM_MAP()), std::end(HEX_2_NUM_MAP()), h) - std::begin(HEX_2_NUM_MAP());
    unsigned char ll = std::find(std::begin(HEX_2_NUM_MAP()), std::end(HEX_2_NUM_MAP()), l) - std::begin(HEX_2_NUM_MAP());
    return (hh << 4) + ll;
std::string UTF8Url::Encode(const std::string & url)
    std::string ret;
    for (auto it = url.begin(); it != url.end(); ++it)
        if (((*it >> 7) & 1) || (std::count(std::begin(ASCII_EXCEPTION()), std::end(ASCII_EXCEPTION()), *it)))
            ret.push_back('%');
            ret.push_back(HEX_2_NUM_MAP()[(*it >> 4) & 0x0F]);
            ret.push_back(HEX_2_NUM_MAP()[*it & 0x0F]);
            ret.push_back(*it);
    return ret;
std::string UTF8Url::Decode(const std::string & url)
    std::string ret;
    for (auto it = url.begin(); it != url.end(); ++it)
        if (*it == '%')
            if (std::next(it++) == url.end())
                throw std::invalid_argument("url is invalid");
            ret.push_back(NUM_2_HEX(*it, *std::next(it)));
            if (std::next(it++) == url.end())
                throw std::invalid_argument("url is invalid");
            ret.push_back(*it);
    return ret;

可以来试试看

int main()
    std::freopen("output", "w", stdout);
    std::string url = u8"https://blog.csdn.net/FlushHip?type=1&name=老王&str={}%";
    std::cout << "before encode: " << url << std::endl;
    std::cout << "after encode: " << UTF8Url::Encode(url) << std::endl;
    std::cout << "after decode: " << UTF8Url::Decode(UTF8Url::Encode(url)) << std::endl;
    return 0;

得到如下结果

before encode: https://blog.csdn.net/FlushHip?type=1&name=老王&str={}%
after encode: https://blog.csdn.net/FlushHip?type=1&name=%E8%80%81%E7%8E%8B&str=%7B%7D%25
after decode: https://blog.csdn.net/FlushHip?type=1&name=老王&str={}%
为什么需要编码
为什么要进行URL编码?通常如果一样东西需要编码,说明这样东西并不适合直接进行传输。
1、会引起歧义:例如 URL 参数字符串中使用 key=value 这样的键值对形式来传参,键值对之间以 & 符号分隔,如 ?postid=5038412&t=1450591802326,服务器会根据参数串的 & 和 = 对参数进行解析,如果 value 字符串中包含了 = 或者 & ,如宝洁公司的简称为P&G,假设需要当做参数去传递,那么可能URL所带参数可能
                                    #pragma once#include #include #include using namespace std;class strCoding{public:    strCoding(void);    ~strCoding(void);       void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转
                                    在做网站分析时,我们经常要分析baidu、google 等搜索引擎的搜索关键字,比如搜索“中国”
在 baidu 中是:http://www.baidu.com/s?wd=%D6%D0%B9%FA&cl=3
在 google 中是:http://www.google.com/search?hl=zh-CN&q=%E4%B8%AD%E5%9B%BD&lr=
“中国”这两个字在 baid
                                    作者:jostree转载请注明出处http://www.cnblogs.com/jostree/p/4374404.html
1.读取UTF-8编码文本原理
首先了解UTF-8的编码方式,UTF-8采用可变长编码的方式,一个字符可占1字节-6字节,其中每个字符所占的字节数由字符开始的1的个数确定,具体的编码方式如下:
U-00000000 - U-0000007F: 0xxxxxxx U...
                                    C++的项目,字符编码是一个大坑,不同平台之间的编码往往不一样,如果不同编码格式用一套字符读取格式读取就会出现乱码。因此,一般都是转化成UTF-8这种平台通用,且支持性很好的编码格式。
Unicode、UTF-8的概念不做过多解释,这里说一下ANSI,我第一次看到这个名词,我看成了ASCII。被Mentor狠批一顿。
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00 ~ 0x7...