首页 > 代码库 > URL解码(GBK/UTF8) C++算法

URL解码(GBK/UTF8) C++算法

我们浏览的网页都会被不同的编码方式编码

例如 :“C++”  URL编码(GBK)为 “C%2B%2B”

 

那么,如何实现解码呢?

通过观察可得url编码的编码规则

1、数字和字母不进行编码。

2、其他符号编码方式为对应ascii码的2位16进制前面加上一个“%”。

例如 “+” 查表可知 对应的16进制数为2B ,所以,“+” 编码成了“%2B”。

 

程序思路:

定义一个char数组存放需要解码的数据,然后用指针遍历,如果碰到%号则对其后面的两位进行转码,然后指针后移3位。如果碰到数字和字母则输出即可。然后指针后移一位。

  1. 程序代码:
 1 #include <iostream> 2 //#include <stdio.h>   3  4 using namespace std; 5  6 int change(char *ch) 7 { 8     int n = atoi(ch); 9     if(!n) //n == 010     {11         return(*ch - ‘A‘ + 10);12     }13     else if( n >= 1 && n <= 9)14     {15         return n;16     }17 }18 19 int main()20 {21     int change(char *);22     char a[20] = {‘\0‘};23     int z;24     cin >> a;25     char *p = a;26     for( int i = 0; i < 20; i++, p++)27     {28         if( int(*p) == 37)29         {30             char c[3] = "";31             char x[2] = {*(p+1)};32             char y[2] = {*(p+2)}; 33             int x1 = change(x);34             int y1 = change(y);35             z = 16*x1 + y1;        36             printf("%c",z);37             p = p + 2;38         }39         else if( *p != ‘\0‘)40         {41             cout << *p;42         }43         if( *p == ‘\0‘)44         {45             break;46         }47         48     }49     return 0;50 }

 

用到的函数:

  1. int atoi( const char *nptr)atio函数是C语言库函数,参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。头文件: #include <stdlib.h>,但在c++中,似乎已经包含了这个库函数。

 

注意的点:

 

1、定义数组char a[20]一定要把数组初始化为空。 否则转码可能出现意想不到的结果。因为你所需要转码的内容可能不能把a的空间占满,那么没有占满的空间数据就是未知的。所以定义的时候最好初始化为空。

 

(1) char str[10]="";

 

(2) char str[10]={‘\0‘};

 

(3) char str[10]; str[0]=‘\0‘;

 

第(1)(2)种方式是将str数组的所有元素都初始化为‘\0‘,而第(3)种方式是只将str数组的第一个元素初始化为‘\0‘。如果数组的size非常大,那么前两种方式将会造成很大的开销。所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第(3)种方式来初始化字符串数组。

 

2、为什么要使用change函数。我们知道,ascii码是可以直接进行加减运算得到对应的16进制数。例如:"2B" = (‘2‘ - ‘0‘) * 16 + (‘B‘ - ‘A‘ + 10)=43 如果是数字字符,直接减字符0,如果是大写字符,直接减字符A,小写同理。B的ascii是66,A的是65,‘B‘ - ‘A‘ = 1 ,则对应的应该是11。那么不使用change函数可以直接运算吗?这里又有一个问题。我们无法确定%号后面的第一位是数字还是字母,所以无法使用公式进行计算,必须先交给change函数判断。int n = atoi(ch); 如果是字母,则返回值为return(*ch - ‘A‘ + 10);(这里只考虑大写的情况),如果是数字,则返回值为return n;

 

3、最后,判断*p的值是否指向’\0’,如果是 ,则结束循环。

 

URL解码(GBK/UTF8) C++算法