C++ 写的UrlEncode和UrlDecode实例

 更新时间:2020年12月10日 10:31:17   作者:claireyuancy  
这篇文章主要介绍了C++ 写的UrlEncode和UrlDecode实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

关于UrlEncode的实现(C++)。网上有非常多不同的版本号。对须要编码的字符集的选取并不统一。那么究竟有没有标准呢?答案是有的。

绝对不编码的,仅仅有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其它字符要视情况而定。所以一般性的urlencode仅仅需保留上述字符不进行编码。

以下给出实现:

unsigned char ToHex(unsigned char x) 
{ 
 return x > 9 ? x + 55 : x + 48; 
} 
 
unsigned char FromHex(unsigned char x) 
{ 
 unsigned char y; 
 if (x >= 'A' && x <= 'Z') y = x - 'A' + 10; 
 else if (x >= 'a' && x <= 'z') y = x - 'a' + 10; 
 else if (x >= '0' && x <= '9') y = x - '0'; 
 else assert(0); 
 return y; 
} 
 
std::string UrlEncode(const std::string& str) 
{ 
 std::string strTemp = ""; 
 size_t length = str.length(); 
 for (size_t i = 0; i < length; i++) 
 { 
  if (isalnum((unsigned char)str[i]) || 
   (str[i] == '-') || 
   (str[i] == '_') || 
   (str[i] == '.') || 
   (str[i] == '~')) 
   strTemp += str[i]; 
  else if (str[i] == ' ') 
   strTemp += "+"; 
  else 
  { 
   strTemp += '%'; 
   strTemp += ToHex((unsigned char)str[i] >> 4); 
   strTemp += ToHex((unsigned char)str[i] % 16); 
  } 
 } 
 return strTemp; 
} 
 
std::string UrlDecode(const std::string& str) 
{ 
 std::string strTemp = ""; 
 size_t length = str.length(); 
 for (size_t i = 0; i < length; i++) 
 { 
  if (str[i] == '+') strTemp += ' '; 
  else if (str[i] == '%') 
  { 
   assert(i + 2 < length); 
   unsigned char high = FromHex((unsigned char)str[++i]); 
   unsigned char low = FromHex((unsigned char)str[++i]); 
   strTemp += high*16 + low; 
  } 
  else strTemp += str[i]; 
 } 
 return strTemp; 
} 

补充知识:C++中URL解码/编码

我就废话不多说了,大家还是直接看代码吧~

#include <iostream> 
#include <string>
using namespace std;
 
char dec2hexChar(short int n) {
	if (0 <= n && n <= 9) {
		return char(short('0') + n);
	}
	else if (10 <= n && n <= 15) {
		return char(short('A') + n - 10);
	}
	else {
		return char(0);
	}
}
 
short int hexChar2dec(char c) {
	if ('0' <= c && c <= '9') {
		return short(c - '0');
	}
	else if ('a' <= c && c <= 'f') {
		return (short(c - 'a') + 10);
	}
	else if ('A' <= c && c <= 'F') {
		return (short(c - 'A') + 10);
	}
	else {
		return -1;
	}
}
 
string escapeURL(const string& URL)
{
	string result = "";
	for (unsigned int i = 0; i < URL.length(); i++) {
		char c = URL[i];
		if (
			('0' <= c && c <= '9') ||
			('a' <= c && c <= 'z') ||
			('A' <= c && c <= 'Z') ||
			c == '/' || c == '.'
			) {
			result += c;
		}
		else {
			int j = (short int)c;
			if (j < 0) {
				j += 256;
			}
			int i1, i0;
			i1 = j / 16;
			i0 = j - i1 * 16;
			result += '%';
			result += dec2hexChar(i1);
			result += dec2hexChar(i0);
		}
	}
	return result;
}
 
string deescapeURL(const string& URL) {
	string result = "";
	for (unsigned int i = 0; i < URL.length(); i++) {
		char c = URL[i];
		if (c != '%') {
			result += c;
		}
		else {
			char c1 = URL[++i];
			char c0 = URL[++i];
			int num = 0;
			num += hexChar2dec(c1) * 16 + hexChar2dec(c0);
			result += char(num);
		}
	}
	return result;
}

以上这篇C++ 写的UrlEncode和UrlDecode实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言实现顺序表基本操作汇总

    C语言实现顺序表基本操作汇总

    这篇文章主要介绍了C语言实现顺序表基本操作汇总,对学习数据结构的朋友有一定的借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C语言的可变参数函数实现详解

    C语言的可变参数函数实现详解

    某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。典型的可变参数函数的例子有printf()、scanf()等,下面我就开始讲解
    2021-08-08
  • 一篇文章带你了解C语言内存对齐公式

    一篇文章带你了解C语言内存对齐公式

    这篇文章主要介绍了C语言内存对齐,包括内存对其的基本概念及用法,以及注意事项,并以实例形式加以说明,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • VScode搭建OpenCV环境的详细步骤

    VScode搭建OpenCV环境的详细步骤

    用vscode来写opencv代码需要自己编译OpenCV,主要用到MinGW-w64和CMake工具。接下来通过本文给大家介绍VScode搭建OpenCV环境的相关知识,需要的朋友可以参考下
    2021-11-11
  • VC创建圆角dialog的实现方法

    VC创建圆角dialog的实现方法

    这篇文章主要介绍了VC创建圆角dialog的实现方法,结合实例形式分析了圆角dialog对话框的创建步骤与相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • C++数据精度问题(对浮点数保存指定位小数)

    C++数据精度问题(对浮点数保存指定位小数)

    这篇文章主要介绍了对浮点数保存指定位小数。比如, 1.123456. 要保存1位小数,,调用方法后, 保存的结果为: 1.1。 再比如,1.98765, 保存2位小数的结果为: 2.00,需要的朋友可以参考下
    2017-08-08
  • C语言实现简单的扫雷功能

    C语言实现简单的扫雷功能

    这篇文章主要为大家详细介绍了C语言实现简单的扫雷功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • OpenGL通过中点法绘制直线和圆

    OpenGL通过中点法绘制直线和圆

    这篇文章主要为大家详细介绍了OpenGL通过中点法绘制直线和圆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 关于"引用"的几点说明介绍

    关于"引用"的几点说明介绍

    引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名
    2013-09-09
  • C++ 纯虚函数详解

    C++ 纯虚函数详解

    本文主要介绍了C++ 纯虚函数详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论