URL编码 下载源代码 URLEncoder.exe是一个使用URLEncode类的MFC对话框程序。 如何处理 一些特殊字符在Internet上传送是件棘手的事情, 经URL编码特殊处理,可以使所有字符安全地从Internet传送。 例如,回车的ASCII值是13,在发送FORM数据时候这就认为是一行数据的结束。 通常,所有应用程序采用HTTP或HTTPS协议在客户端和服务器端传送数据。服务器端从客户端接收数据有两种基本方法: 1、数据可以从HTTP头传送(COOKIES或作为FORM数据发送) 当数据包含在URL,它必须遵循URL语法进行编码。在WEB服务器端,数据自动解码。考虑一下下面的URL,哪个数据是作为查询参数。 例如:http://WebSite/ResourceName?Data=Data WebSite是URL名称 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结果。某个范围中的字符是否安全。
所有不安全的ASCII字符都需要编码,例如,范围(32-47, 58-64, 91-96, 123-126)。
如何实现 字符的URL编码是将字符转换到8位16进制并在前面加上''%''前缀。例如,US-ASCII字符集中空格是10进制 URLEncode: URLEncode是一个C++类,来实现字符串的URL编码。CURLEncode类包含如下函数: 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. |