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...