C++替换方法和URL转义字符

时间:2022-12-19 19:35:03

废话少说,工作中遇到了一个问题URL中存在类似于"&"的东西,这是其实是"&"的意思,个别设备可以播放,而一些设备播放不了,查问题耗费了半天。工作之余抽取了个公用函数,如下:

#include <string.h>
... ...

string replaceStr(string str, const char *replaceValue, const char *destValue)
{
int pos = -1;
while((pos = str.find(replaceValue)) >= 0)
{
//LOGD("pos :%d",pos);
str.erase(pos, strlen(replaceValue));
if (destValue != NULL)
{
str.insert(pos, destValue);
}
pos = -1;
}
return str;
}

调用则如下:

string url = "http://111.13.3.63/vhot2.qqvideo.tc.qq.com/k0128a6tnxy.mp4?sdtfromv5000&amp;amp;amp;vkey=C3F74B6DD48CCEE7C7C15A6203CF85B24BAA14C84DB6267EB63D39012D4F02616D854320E4F2AA260D3D1EC1523C1FD8D9509AB10488386E&amp;platform=2&amp;locid=8597199d-a751-4ac9-88c2-6ff26ec5f753&amp;size=65975563&amp;ocid=242229164";
if (url.find("&amp;") >= 0)
{
url = replaceStr(url, "amp;", NULL);
}
if (url.find("&") >= 0)
{
url = replaceStr(url, "&", "%26");
}


看起来很冗余。。有待优化!

对于为什么& 替换成%26这就是url中的转义字符的意思了。具体可以查看下面的URL编码表

backspace %08
I %49
v %76
ó %D3
tab %09
J %4A
w %77
&Ocirc; %D4
linefeed %0A
K %4B
x %78
&Otilde; %D5
creturn %0D
L %4C
y %79
&Ouml; %D6
space %20
M %4D
z %7A
&Oslash; %D8
! %21
N %4E
{ %7B
ù %D9
" %22
O %4F
| %7C
ú  %DA
# %23
P %50
} %7D
&Ucirc; %DB
$ %24
Q %51
~ %7E
ü %DC
% %25
R %52
¢ %A2
Y %DD
& %26
S %53
£ %A3
T %DE
' %27
T %54
¥ %A5
&szlig; %DF
( %28
U %55
| %A6
à %E0
) %29
V %56
§ %A7
á %E1
* %2A
W %57
&laquo; %AB
a %E2
+ %2B
X %58
&not; %AC
&atilde; %E3
, %2C
Y %59
ˉ %AD
&auml; %E4
- %2D
Z %5A
o %B0
&aring; %E5
. %2E
[ %5B
± %B1
&aelig; %E6
/ %2F
\ %5C
a %B2
&ccedil; %E7
0 %30
] %5D
, %B4
è %E8
1 %31
^ %5E
μ %B5
é %E9
2 %32
_ %5F
&raquo; %BB
ê %EA
3 %33
` %60
&frac14; %BC
&euml; %EB
4 %34
a %61
&frac12; %BD
ì %EC
5 %35
b %62
&iquest; %BF
í %ED
6 %36
c %63
à %C0
&icirc; %EE
7 %37
d %64
á %C1
&iuml; %EF
8 %38
e %65
&Acirc; %C2
e %F0
9 %39
f %66
&Atilde; %C3
&ntilde; %F1
: %3A
g %67
&Auml; %C4
ò %F2
; %3B
h %68
&Aring; %C5
ó %F3
< %3C
i %69
&AElig; %C6
&ocirc; %F4
= %3D
j %6A
&Ccedil; %C7
&otilde; %F5
> %3E
k %6B
è %C8
&ouml; %F6
%3F
l %6C
é  %C9
÷  %F7
@ %40
m %6D
ê %CA
&oslash; %F8
A %41
n %6E
&Euml; %CB
ù %F9
B %42
o %6F
ì  %CC
ú  %FA
C %43
p %70
í %CD
&ucirc; %FB
D %44
q %71
&Icirc; %CE
ü %FC
E %45
r %72
&Iuml; %CF
y %FD
F %46
s %73
D %D0
t %FE
G %47
t %74
&Ntilde; %D1
&yuml; %FF
H %48
u %75
ò %D2


查看了下相关资料,记录下备忘下URL编码规则:


URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ASCII码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ASCII码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ASCII码是-17670,十六进制是BAFA,url编码是“%BA%FA”。


记得之前使用J2EE做web开发的时候,防SQL注入就常用URL的编码



谨以此文备忘。