URL编码

作者: Chandrasekhar Vuppalapati

翻译:eastvc

下载源代码

本文的目的是设计一个完成URL编码的C++类。在我曾经的项目中,我需要从VC++ 6.0应用程序中POST数据,而这些数据需要进行URL编码。我在MSDN中查找能根据提供的字符串生成URL编码的相关类或API,但我没有找到,因此我必须设计一个自己的URLEncode C++类。

URLEncoder.exe是一个使用URLEncode类的MFC对话框程序。

如何处理

一些特殊字符在Internet上传送是件棘手的事情, 经URL编码特殊处理,可以使所有字符安全地从Internet传送。

例如,回车的ASCII值是13,在发送FORM数据时候这就认为是一行数据的结束。

通常,所有应用程序采用HTTP或HTTPS协议在客户端和服务器端传送数据。服务器端从客户端接收数据有两种基本方法:

1、数据可以从HTTP头传送(COOKIES或作为FORM数据发送)

2、可以包含在URL中的查询部分

当数据包含在URL,它必须遵循URL语法进行编码。在WEB服务器端,数据自动解码。考虑一下下面的URL,哪个数据是作为查询参数。

例如:http://WebSite/ResourceName?Data=Data

WebSite是URL名称

ResourceName可以是ASP或Servlet名称

Data是需要发送的数据。如果MIME类型是Content-Type: application/x-www-form-urlencoded,则要求进行编码。

RFC 1738

RFC 1738指明了统一资源定位(URLs)中的字符应该是US-ASCII字符集的子集。这是受HTML的限制,另一方面,允许在文档中使用所有ISO- 8859-1(ISO-Latin)字符集。这将意味着在HTML FORM里POST的数据(或作为查询字串的一部分),所有HTML编码必须被编码。

ISO-8859-1 (ISO-Latin)字符集

在下表中,包含了完整的ISO-8859-1 (ISO-Latin)字符集,表格提供了每个字符范围(10进制),描述,实际值,十六进制值,HTML结果。某个范围中的字符是否安全。

Character range(decimal)

Type

Values

Safe/Unsafe

0-31

ASCII Control Characters

These characters are not printable

Unsafe

32-47

Reserved Characters

'' ''!?#$%&''()*+,-./

Unsafe

48-57

ASCII Characters and Numbers

0-9

Safe

58-64

Reserved Characters

:;<=>?@

Unsafe

65-90

ASCII Characters

A-Z

Safe

91-96

Reserved Characters

[\]^_`

Unsafe

97-122

ASCII Characters

a-z

Safe

123-126

Reserved Characters

{|}~

Unsafe

127

Control Characters

'' ''

Unsafe

128-255

Non-ASCII Characters

'' ''

Unsafe

所有不安全的ASCII字符都需要编码,例如,范围(32-47, 58-64, 91-96, 123-126)。

下表描述了这些字符为什么不安全。

Character

Unsafe Reason

Character Encode

"

Delimiters around URLs in free text

%3C

>

Delimiters around URLs in free text

%3E

.

Delimits URLs in some systems

%22

#

It is used in the World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it.

%23

{

Gateways and other transport agents are known to sometimes modify such characters

%7B

}

Gateways and other transport agents are known to sometimes modify such characters

%7D

|

Gateways and other transport agents are known to sometimes modify such characters

%7C

\

Gateways and other transport agents are known to sometimes modify such characters

%5C

^

Gateways and other transport agents are known to sometimes modify such characters

%5E

~

Gateways and other transport agents are known to sometimes modify such characters

%7E

[

Gateways and other transport agents are known to sometimes modify such characters

%5B

]

Gateways and other transport agents are known to sometimes modify such characters

%5D

`

Gateways and other transport agents are known to sometimes modify such characters

%60

+

Indicates a space (spaces cannot be used in a URL)

%20

/

Separates directories and subdirectories

%2F

?

Separates the actual URL and the parameters

%3F

&

Separator between parameters specified in the URL

%26

如何实现

字符的URL编码是将字符转换到8位16进制并在前面加上''%''前缀。例如,US-ASCII字符集中空格是10进制

的32或16进制的20,因此,URL编码是%20。

URLEncode: URLEncode是一个C++类,来实现字符串的URL编码。CURLEncode类包含如下函数:

isUnsafeString

decToHex

convert

URLEncode

URLEncode()函数完成编码过程,URLEncode检查每个字符,看是否安全。如果不安全将用%16进制值进行转换并添加

到原始字符串中。

代码片断:

class CURLEncode

{

private:

static CString csUnsafeString;

CString (char num, int radix);

bool isUnsafe(char compareChar);

CString convert(char val);

public:

CURLEncode() { };

virtual ~CURLEncode() { };

CString (CString vData);

};

bool CURLEncode::isUnsafe(char compareChar)

{

bool bcharfound = false;

char tmpsafeChar;

int m_strLen = 0;

m_strLen = csUnsafeString.GetLength();

for(int ichar_pos = 0; ichar_pos < m_strLen ;ichar_pos++)

{

tmpsafeChar = csUnsafeString.GetAt(ichar_pos);

if(tmpsafeChar == compareChar)

{

bcharfound = true;

break;

}

}

int char_ascii_value = 0;

//char_ascii_value = __toascii(compareChar);

char_ascii_value = (int) compareChar;

if(bcharfound == false && char_ascii_value > 32 &&

char_ascii_value < 123)

{

return false;

}

// found no unsafe chars, return false

else

{

return true;

}

return true;

}

CString CURLEncode::decToHex(char num, int radix)

{

int temp=0;

CString csTmp;

int num_char;

num_char = (int) num;

if (num_char < 0)

num_char = 256 + num_char;

while (num_char >= radix)

{

temp = num_char % radix;

num_char = (int)floor(num_char / radix);

csTmp = hexVals[temp];

}

csTmp += hexVals[num_char];

if(csTmp.GetLength() < 2)

{

csTmp += ''0'';

}

CString strdecToHex(csTmp);

// Reverse the String

strdecToHex.MakeReverse();

return strdecToHex;

}

CString CURLEncode::convert(char val)

{

CString csRet;

csRet += "%";

csRet += decToHex(val, 16);

return csRet;

}

参考:

URL编码: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm.

RFC 1866: The HTML 2.0 规范 (纯文本). 附录包含了字符表: http://www.rfc-editor.org/rfc/rfc1866.txt.

Web HTML 2.0 版本(RFC 1866) : http://www.w3.org/MarkUp/html-spec/html-spec_13.html.

The HTML 3.2 (Wilbur) 建议: http://www.w3.org/MarkUp/Wilbur/.

The HTML 4.0 建议: http://www.w3.org/TR/REC-html40/.

W3C HTML 国际化区域: http://www.w3.org/International/O-HTML.html.

posted on 2007-01-04 13:46 永遇乐 阅读(2141) 评论(3)  编辑 收藏 引用 所属分类: 网络

html%3c转译,[转]URL编码相关推荐

  1. %3c strong%3e html,模型绑定url编码的字符串mvc 3

    我正在使用MVC 3模型绑定与JQuery序列化程序()编辑窗体中的某些数据.除非在我的数据中有一些'url-encoded'(不知道更好的术语)文本,否则所有的工作都很好.这些数据就在那里,因为我使 ...

  2. html中%3c%3e字符原样显示,整理HTML5中支持的URL编码与字符编码_html5教程技巧-H5教程...

    URL 编码URL 编码就是将 URLs 中不宜打印的字符或者具有特殊意义的字符转换为 Web 浏览器和服务器明白且普遍接受的表示法. 这些字符包括: ASCII 控制字符 - 不宜打印的字符通常用于 ...

  3. php %3cphp用大括号表示,整理HTML5中支持的URL编码与字符编码_html5教程技巧

    URL 编码URL 编码就是将 URLs 中不宜打印的字符或者具有特殊意义的字符转换为 Web 浏览器和服务器明白且普遍接受的表示法. 这些字符包括: ASCII 控制字符 - 不宜打印的字符通常用于 ...

  4. java中http解析url,java url 编码(解析http请求汉语言地址 )

    java url 编码(解析http请求中文地址 ) 在近在做项目的过程中,由于客户那边服务器上提供的有很多中文结构目录.请求要的地址不能正常运行显示出来.下面来分享一下我对http协议处理请求中文的 ...

  5. HTML-参考手册: URL 编码

    ylbtech-HTML-参考手册: URL 编码 1.返回顶部 1. HTML URL 编码 参考手册 URL 编码会将字符转换为可通过因特网传输的格式. URL - 统一资源定位器 Web 浏览器 ...

  6. 【转】C# 中文URL编码

    正在研究一个程序,输入一个关键字,能够把这个关键字发送到Google,yahoo等搜索引擎,进行搜索,然后打开结果网页.原理很简单.比如在Google搜索China,搜索结果页面的URL就是& ...

  7. URL编码 - Java加密与安全

    JAVA的URL编码我们先看看什么是编码?ASCII码就是一种编码,A的编码是16进制的0x41,字母B的编码是0x42,而中文的中是用Unicode编码,中就是0x4e2d,用UTF-8编码,需要3 ...

  8. html%3cform%3e不换行,HTML URL 编码

    参考网址:http://www.w3schools.com/cn/tags/ref_urlencode.asp URL编码(URL encoding)的作用是将字符转化为可在因特网上安全传输的格式. ...

  9. HTML Url 编码(Encode 和 Url Decode)

    URL 编码 - 从 %00 到 %8f ASCII Value URL-encode ASCII Value URL-encode ASCII Value URL-encode ? %00 0 %3 ...

  10. HTML URL 编码参考手册-------转载

    一.基础知识点: web浏览器通过URL从WEB服务器请求页面. 在线URL编码解码工具-UrlEncode编码-UrlDecode解码在线工具 二.URL编码作用: 1.URL编码将字符转换为可通过 ...

最新文章

  1. java nio 写事件_Java NIO
  2. Visual Studio Code 打开程序文件中文乱码解决方法
  3. 如何与Ubuntu One同步配置文件
  4. libz mysql_Docker和Mysql:libz.so.1:无法打开共享对象文件:权限被拒绝
  5. WordPress图片插件:Auto Highslide修改版(转)
  6. Java 如何使用protobuf
  7. 2021 年网易云音乐实时计算平台发展和挑战
  8. Verilog中的按键消抖
  9. js金额小写转换成大写
  10. oracle 12c pdb数据库全库备份
  11. Spring Boot实现QQ邮件发送,用户注册功能——前后端分离版
  12. 神经网络(二)—— 神经元、Logistic回归模型
  13. 降噪提升动漫图片,人物照片等图片画质(分享)
  14. sass、scss、和css的关系
  15. \int_0^{+\infty} \frac{\sin x}{x}\mathop{}\!\mathrm{d}{x}
  16. 分销商城怎样设计分销体系以及会员成长体系_OctShop
  17. vue学习笔记 DAY1 P1~P6
  18. 电脑连接了网络却打不开网页
  19. C# StreamRead和StreamWrite
  20. Redis基础、超详细入门教程

热门文章

  1. 编程语言新宠儿——Julia诞生记(转)
  2. 何为领导力 —— 《Working Backwards》书评
  3. 他用代码卖手机,卖出年流水上亿
  4. 蚂蚁金服研究员何征宇:系统软件和开源都是手段,不是目的
  5. 阿里云郑晓:浅谈GPU虚拟化技术(第四章)
  6. 【回归预测】基于matlab麻雀算法优化LSSVM回归预测【含Matlab源码 1128期】
  7. 【钟表识别】基于matlab GUI形态学钟表识别【含Matlab源码 1351期】
  8. 【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】
  9. 【DCVRP】基于matlab蚁群算法求解带容量+距离的车辆路径规划问题【含Matlab源码 1038期】
  10. 【图像处理】基于matlab分形插值算法调换图片【含Matlab源码 197期】