URL编码

问题场景:URL中有中文字符时,无法向这个URL发送GET请求

我尝试了一下使用Chrome浏览器输入带中文字符的URL是可以的,这就勾起了我的疑问,难道是我中文编码的问题?

显然并不是中文编码GBK或是UTF8的问题,在Chrome里打开F12抓包,发现带有中文的URL在发送时变成了另一种格式,中文字符变成了%2D%FG%…这样的十六进制,网上搜了一下什么是URLencode,总结一下自己遇到的问题和解决办法。

URLencode

为了符合URL规范的一种编码格式。在URL标准规范中,是不允许出现中文字符的。所以要转换为一种通用的且规范的URL格式。
URL规范说明

URLencode 原理(代码解释)

  1. 空格转换为 ‘+’
  2. 非ASCII码能打印的字符转换为 %+两个十六进制数表示的字符,例如十六进制数0xAB23 ,要将其转换为%AB%23。
  3. 一个十六进制数是4位表示,而一个unsigned char是8位,包含了两个十六进制数。故需要将unsigned char 的高4位和低4位转换成为两个字符,先转高4位,再转低4位。
unsigned char CHAR_TO_HEX(unsigned char ch)
{return (unsigned char)(ch > 9 ? ch + 55 : ch + 48);
}/// <summary>
/// url编码,使其能够给带中文的url发送请求
/// </summary>
/// <param name="org_url">UTF8编码的url</param>
/// <returns>转码后的url</returns>
string url_encode(const string& org_url)
{unsigned char ch_temp;string str_dest;cout << "原字符串:" << org_url << endl;for (const char ch : org_url) {ch_temp = static_cast<unsigned char>(ch);// 'a'~'z' 'A'~'Z' '0'~'9' \:-_.!~*()/ 这些字符不转if ((ch_temp >= 'a' && ch_temp <= 'z') || (ch_temp >= 'A' && ch_temp <= 'Z')|| (ch_temp >= '0' && ch_temp <= '9') || strchr("\\:-_.!~*()/", ch_temp)) {str_dest += ch_temp;}else if (ch_temp == ' ') {str_dest += '+';}else {str_dest += '%';/*** 一个unsigned char 是8位,有两个十六进制数* 四位是一个十六进制数,先转换高4位,右移4位去除低4位* 去除高4位再转换低4位* 0xDE -> "DE"*///cout << "原十六进制数:" <<std::uppercase << std::hex<< (int)ch_temp <<endl;str_dest += CHAR_TO_HEX((unsigned char)(ch_temp >> 4));  str_dest += CHAR_TO_HEX((unsigned char)(ch_temp & 0x0f));  }}cout << "转换后字符串:" << str_dest << endl;return str_dest;
}

文章参考:URLEncode与URLDecode总结与实现,URLEncode

URL encode 编码相关推荐

  1. c# 对Url 解码编码

    /// <summary>/// 对Url进行编码/// </summary>/// <param name="url">url</par ...

  2. JS 和 Java 中URL特殊字符编码方式

    前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1.  编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String ...

  3. go url 参数编码和解码

    为什么80%的码农都做不了架构师?>>>    1 在做支付的时候会涉及到 url参数编码和解码,然后转换成自己想要的格式 app_id=2016073100129537&b ...

  4. java net unicode / native2ascii / url decode / url encode / UTF8 / js url code

    s http://chengyue2007.iteye.com/blog/1852095 java中URL 的编码和解码函数 java.net.URLEncoder.encode(String s)和 ...

  5. VB6.0 url encode

    帮一客户修改VB6程序,需要对一个http url进行编码操作,也就是url encode.经过一番研究,决定用插件实现. 1. 安装插件Chilkat Chilkat Full-Version So ...

  6. url在线编码和解码

    在工作中,经常遇到encode之后的url.想查看里面的某个参数的时候,很不直观.今天在网上搜了一下对url在线编码和解码的网站.对我来说,使用起来很方便.而且这个网站里面,不仅仅有对url的编码和解 ...

  7. HTML Encode 编码在线转换工具

    HTML Encode 编码在线转换工具 请输入编/解码的进制(2, 8, 10, 16) 请输入编/解码的前缀("&#xH:16进制, &#D:10进制") 请输 ...

  8. JS对url进行编码和解码(三种方式区别)

    Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape().虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起. escape 和 ...

  9. 认识 URL 及其编码

    文章目录 1.URL 是什么 2.URL 一般语法 3.具体协议 4.HTTP(S) URL 5.HTTP(S) URL 特殊字符 6.URL 编码 6.1 为什么需要对 URL 编码 6.2 URL ...

最新文章

  1. AngularJS $eval $parse
  2. input 强大的 input 标签
  3. mysql router docker_Docker镜像瘦身 - SegmentFault 思否
  4. POJ 2417 Discrete Logging 离散对数
  5. 跨域,json与jsonp格式
  6. 框架:Servlet的生命周期
  7. GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)
  8. php对mysql基础操作_php+mysql的基础操作
  9. 记录青春的人人网又回来了,情怀还能唤回用户吗?
  10. 采用Kettle分页处理大数据量抽取任务
  11. c++读取文本文件里的指定位置的字符_(12)文本文件操作参考
  12. 【DIY贴片机】基于opencv识别定位电子元件
  13. 测试驱动开发(TDD)开发思路
  14. 怎么用计算机解锁手机密码华为,华为手机忘记解锁密码如何解锁?两招轻松搞定...
  15. C语言确定某年星期六,c语言 怎么算某年某月某日是星期几啊?
  16. 关于MAXIMO数据限制代码的理解
  17. mysql 日志重做,設置MySQL重做日志大小
  18. ant-design-vue导航菜单a-menu的详细使用
  19. 利用3D效果制作立体导航栏
  20. HUAWEI Mate bookD 加装固态

热门文章

  1. 经典图书介绍:广义相对论--1972讲稿
  2. HDU6069(区间筛)
  3. 万万没想到,“红孩儿” 竟然做了程序员,还是 CTO!
  4. MapReduce Inverted Index
  5. 你的生命有什么可能 读书笔记
  6. js实现图片的随机抽奖
  7. 初识 PS CS6(十三)___用快速选择工具择图
  8. Restful API 接口规范
  9. 解决“error: failed to push some refs to ‘git@gitee.com:username/repo.git‘“
  10. LATEX教程第四讲——那些不得不说的宏包(下)