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实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++11 Unicode编码转换

    1.char16_t与char32_t 在C++98中,为了支持Unicode字符,使用wchar_t类型来表示"宽字符",但并没有严格规定位宽,而是让wchar_t的宽度由编译器实现,因此不同的编译器有着不同的实现方式,GNU C++规定wchar_t为32位,Visual C++规定为16位.由于wchar_t宽度没有一个统规定,导致使用wchar_t的代码在不同平台间移植时,可能出现问题.这一状况在C++11中得到了一定的改善,从此Unicode字符的存储有了统一类型: (1)c

  • C++类URL编码和解码使用技巧

    在项目开发过程中,经常会使用到c++ 的url编码和解码,本文将以此问题详细介绍使用技巧,需要的朋友可以参考下 复制代码 代码如下: #pragma once #include <iostream> #include <string> #include <windows.h> using namespace std; class strCoding { public: strCoding(void); ~strCoding(void); void UTF_8ToGB23

  • C++ 获取URL内容的实例

    我就废话不多说了,大家还是直接看代码吧~ 以下内容摘自StackOverFlow 链接 #ifndef HTTPUTIL_H #define HTTPUTIL_H #include <windows.h> #include <string> #include <stdio.h> using std::string; #pragma comment(lib,"ws2_32.lib") void mParseUrl(char *mUrl, string

  • C++实现哈夫曼编码

    本文实例为大家分享了C++实现哈夫曼编码的具体代码,供大家参考,具体内容如下 #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int Max = 300; class tree{ public: char s; int num; tree *left; tree *right; tree(){ s= '!'; num =

  • C++实现编码转换的示例代码

    代码地址 https://github.com/gongluck/Code-snippet/tree/master/cpp/code%20conversion 需求 编码转换在实际开发中经常遇到,通常是ANSI.Unicode和Utf-8之间相互转换.实现也有很多种,有查表法.使用C++11.使用boost.使用系统API.C++11和boost几乎可以实现一套代码,在linux和windows都能使用,但实际会有很多坑,相当于代码几乎不改,但是要改一下系统环境.所以有一种实现就是判断系统的版本

  • C++ 写的UrlEncode和UrlDecode实例

    关于UrlEncode的实现(C++).网上有非常多不同的版本号.对须要编码的字符集的选取并不统一.那么究竟有没有标准呢?答案是有的. 绝对不编码的,仅仅有字母.数字.短横线(-).下划线(_).点(.)和波浪号(~),其它字符要视情况而定.所以一般性的urlencode仅仅需保留上述字符不进行编码. 以下给出实现: unsigned char ToHex(unsigned char x) { return x > 9 ? x + 55 : x + 48; } unsigned char Fro

  • php自定义urlencode,urldecode函数实例

    本文实例讲述了php自定义urlencode,urldecode函数.分享给大家供大家参考.具体如下: //配合JavaScript的ajaxObject函数, 对字串进行转码. function ajax_encode($str){ $patern = array("/%/","/=/","/&/"); // % 必须是第一个项, 替换是按项的顺序进行的. $rp = array("%25","%26&qu

  • php urlencode()与urldecode()函数字符编码原理详解

    其原理就是把中文字符转换为十六进制并按某种规则进行字符串组合,实现字符的编码与解编码,保证URL数据传递过程中字符的完整性和兼容性,主要讨论中文字符的编码情况. 一,FireFox浏览器编码中文字符 在Firefox浏览器下如果输入中文字符,将会自动实现URL编码,如下 按下Enter键前 按下Enter键后 二,urlencode()函数原理 urlencode()函数用于编码URL字符串,这里主要讨论中文字符的编码情况, 实例如下 复制代码 代码如下: echo urlencode('不要迷

  • 使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到最初体型 4.变色食物:吃了会根据食物颜色改变蛇的颜色 #coding=UTF-8 from Tkinter import * from random import randint import tkMessageBox class Grid(object): def __init__(self,

  • 用js写的一个路由(简单实例)

    前几天在网上看了一个大牛用js写了一个路由的,有一句代码一直不知道怎么回事,后来就自己写了一个,写的比较的粗糙,我觉得把面向对象的思想都搞得乱七八糟的,不过功能实现了. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js实现路由</title> </head> <body> &l

  • 用JavaScript实现UrlEncode和UrlDecode的脚本代码

    复制代码 代码如下: <script type="text/vbscript">     Function str2asc(strstr)       str2asc = hex(asc(strstr))      End Function      Function asc2str(ascasc)       asc2str = chr(ascasc)      End Function     </script> 将vbscript函数转成javascrip

  • 用JS写的一个Ajax库(实例代码)

    myajax是一个用js编写的一个跨浏览器的ajax库,支持get, post, jsonp请求,精巧,简单. 一.发送GET请求: myajax.get({ <span style="white-space:pre"> </span>data: {}, //参数 url: "", //请求地址 //发生错误是调用 error: function(data) { }, //请求成功调用 success: function(data){ <

  • 运用jQuery写的验证表单(实例讲解)

    //运用jQuery写的验证表单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equ

  • PHP写的简单数字验证码实例

    用PHP写的随机生成的5位数字验证码 $yzm = ""; for($i=0;$i<5;$i++) { $a = rand(0,9); $yzm.= $a; } echo $yzm; 以上这篇PHP写的简单数字验证码实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • C++使用htslib库读入和写出bam文件的实例

    有时候我们需要使用C++处理bam文件,比如取出read1或者read2等符合特定条件的序列,根据cigar值对序列指定位置的碱基进行统计或者对序列进行处理并输出等,这时我们可以使用htslib库.htslib可以用来处理SAM, BAM,CRAM 和VCF文件,是samtools.bcftools的核心库. #include <stdio.h> #include <stdlib.h> #include <htslib/sam.h> using namespace st

随机推荐