- 浏览: 473519 次
- 性别:
- 来自: 湖南
文章分类
- 全部博客 (201)
- j2ee (43)
- oracle (9)
- mysql (7)
- db2 (1)
- j2se (3)
- spring (1)
- hibernate (3)
- struts (0)
- Berkeley DB (0)
- linux (60)
- Apache2+PHP+MYSQL (2)
- solr (15)
- svn (1)
- IntelliJ Idea (1)
- eclipse,myeclipse (4)
- ant (2)
- vim (8)
- IT生活 (4)
- 测试 (6)
- lucene (4)
- shell (1)
- nutch (18)
- thread (1)
- hadoop (5)
- mapreduce (0)
- Python (4)
- 硬件 (1)
- database (1)
- maven (1)
- 正则表达 (0)
- 互联网 (1)
最新评论
-
youngcoder:
good job
HTTP协议头部与Keep-Alive模式详解 -
javazdq:
受教了 解释的不错。
lucene创建索引高级特性和索引创建参数优化 -
josico:
有几个问题想问下楼主1. LinkedBlockingQueu ...
生产者-消费者-BlockingQueue -
annybz:
有没有关于 BlockingQueue和ConcurrentL ...
生产者-消费者-BlockingQueue -
uniquejava:
多谢,记录的很真实。
DB2 学习记录
个人技术博客:http://demi-panda.com
发现现在几乎所有的网站都对url中的汉字和特殊的字符,进行了urlencode操作,也就是:
http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/
这个样子,中间%形式的,肯定就是我的登录用户名称了吧。
为什么对这些字符进行了u的编码形式,是为了字符编码(gbk、utf8)还是为了不出现特殊的字符在url中?都知道要转,但是转了的真正好处呢。查看了网上的很多资料,也没有找到更加准确的说法。
url转义其实也只是为了符合url的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。
看一下php的urlencode的说明了。
urlencode — 编码 URL 字符串
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(% )后跟两位十六进制数,空格则编码为加号(+ )。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode() )不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。
标准的英文说明是:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed] , and reserved characters used for their reserved purposes may be used unencoded within a URL."
那哪些字符是需要转化的呢?
1. ASCII 的控制字符
这些字符都是不可打印的,自然需要进行转化。
2. 一些非ASCII字符
这些字符自然是非法的字符范围。转化也是理所当然的了。
3. 一些保留字符
很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?
4. 就是一些不安全的字符了。
例如:空格。为了防止引起歧义,需要被转化为“+”。
明白了这些,也就知道了为什么需要转化了,而转化的规则也是很简单的。
按照每个字符对应的字符编码,不是符合我们范围的,统统的转化为%的形式也就是了。自然也是16进制的形式。
和字符编码无关
通过urlencode的转化规则和目的,我们也很容易的看出,urleocode是基于字符编码的。同样的一个汉字,不同的编码类型,肯定对应不同的urleocode的串。gbk编码的有gbk的encode结果。
apache等服务器,接受到字符串后,可以进行decode,但是还是无法解决编码的问题。编码问题,还是需要靠约定或者字符编码的判断解决。
因此,urleocode只是为了url中一些非ascii字符,可以正确无误的被传输,至于使用哪种编码,就不是eocode所关心和解决的问题了。
编码问题,不是urlencode所要解决的。
再结合 Java API 写一个例子,帮助进一步理解:
import java.net.*;
public class TestURI
{
public static void main(String[] args) throws Exception
{
String path = args[0];
String query = args[1];
URI uri = new URI(
"http",
null,
"smartstorage.yoyoyws.com",
80,
path,
query,
null);
System.out.println("uri.toString(): " + uri.toString());
System.out.println("uri.toASCIIString(): " + uri.toASCIIString());
}
}
运行:
java TestURI "/a/b/文件 1.txt" "versionId=ver_1"
结果:
uri.toString(): http://smartstorage.yoyoyws.com:80/a/b/文件%201.txt?versionId=ver_1
uri.toASCIIString(): http://smartstorage.yoyoyws.com:80/a/b/%E6%96%87%E4%BB%B6%201.txt?versionId=ver_1
servlet 实现了 doGet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
System.out.println("getRequestURI: " + request.getRequestURI());
System.out.println("getParam: " + request.getParameter("param"));
}
发送请求:
http://localhost:8080/你好?param=你好
tomcat 打印(tomcat 配置 URIEncoding="UTF-8"):
getRequestURI: /%E4%BD%A0%E5%A5%BD
getParam: 你好
结论:
tomcat 对 URL 中的 paramater 部分自动做 url decode,而不会对 URL 中的 path 部分做 url decode,需要应用开发人员来自己做 decode。
我们用 Java 作为 client 发送 HTTP 请求时,应该按照上面例子中的写法(调用 toASCIIString() )构造请求的 URL
参考资料:
另外 JDK 中也有一段详细的介绍:
http://download.oracle.com/javase/6/docs/api/java/net/URI.html#encode
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
http://cn.php.net/manual/zh/function.urlencode.php
发表评论
-
Maven使用deploy命令部署构建
2012-07-18 17:13 2425个人技术博客:http:/ ... -
Java 对象序列化您不知道的 5 件事
2012-07-04 14:56 1361个人技术博客:http://demi-panda.com ... -
Solr 获取分词
2012-05-07 18:32 3529个人博客:http://demi-panda.com ... -
地图经纬度距离计算
2012-03-30 15:43 2372public static final doubl ... -
ThreadLocal类
2012-03-01 18:38 901个人技术博客:http://demi-panda.com ... -
解决 – java.lang.OutOfMemoryError: unable to create new native thread
2012-01-16 20:27 2729一、认识问题: 首先我们通过下面这个 测试程序 ... -
Spring MVC中默认的ResponseBody为String的乱码问题
2011-12-22 16:54 1381个人技术博客:http://demi-panda.com ... -
ASCII和中文互转
2011-07-29 13:34 3783个人技术博客:http://demi-panda.com ... -
JVM 参数详解
2011-07-06 14:23 6444个人技术博客:http://demi-panda.com ... -
笔记之三-robots
2011-06-16 16:13 1105一、robots robots主要作用是屏蔽一些不愿意让 ... -
HTTP协议头部与Keep-Alive模式详解
2011-06-16 15:55 17222个人技术博客:http://demi-panda.com ... -
java.net.SocketException: Too many open files解决方法
2011-03-24 15:34 1169Get current limit: ulimit - ... -
利用HAProxy实现负载均衡
2011-02-14 11:04 2441HAProxy的安装和部署 Posted o ... -
负载均衡工具haproxy安装,配置,使用
2011-02-12 11:28 3877一,什么是haproxy HAProxy提供高可 ... -
Java编程思想第四版 完整中文版下载
2011-01-09 21:11 4131个人技术博客:http://demi-panda.com ... -
Java 理论与实践: 正确使用 Volatile 变量
2011-01-06 23:45 461Java 语言中的 volatile ... -
Java常用正则表达式
2010-12-08 20:41 920"^\d+$" //非负整数(正整数 + ... -
JConsole远程连接
2010-12-02 13:58 996JConsole很好用,可以解决很多疑难杂症。但远程连接需要设 ... -
JVM配置参数中文说明
2010-12-02 13:04 1190JVM配置参数中文说明: -------- ... -
Java 代理模式与动态代理类
2010-11-21 16:51 3523代理模式与Java 动态代理类 ...
相关推荐
网址编码解码,jQuery版Url.encode,Url.decode,Url.parse,一个来自jQuery的URL Decoder解码、编码插件,为你的URL安全定义一道安全防线,示例文件本身就是一个值得学习的实例,自带的示例将告诉你如何使用这款URL...
NULL 博文链接:https://lindows.iteye.com/blog/259125
NULL 博文链接:https://icecream0.iteye.com/blog/854682
C++的UrlEncode UrlDecode代码。
自己动手写了一个HTML码URL-encode码转换器,给大家分享一下。
为了避免浏览器采用了我们不希望的编码,所以最好不要在URL中直接使用非ASCII字符,而采用URL Encode编码过的字符串%. 比如: URL: http://localhost:8080/example/中国?name=中国 建议: URL: ...
urlencode urldecode实现,在xcode里使用c++混编
Encode_ Decode Tools URL编码解码工具
本文用C++来实现UrlEncode!
网络传输文本,urlEncode和decode的实现。 在vs 2005上通过实验。
HTTP协议中的缓存 HTTP缓存:当web请求到达缓存时,如果本地有“已缓存”... 缓存的优点: 1.减少冗余的数据传输,节省传输时间 2.... 3.... fiddler中查看缓存的header: ... 判断缓存是否为最新(新鲜度): 1....
主要介绍了使Nginx服务器支持中文URL的相关配置方法,搜索引擎方面Google目前对中文URL的支持度也很好,需要的朋友可以参考下
Laravel开发-urlencode 允许在路由参数中使用urlencoded斜杠等
[工具查询]渝海URL编码转换工具 v1.1_yh_url_encode.zip
邮递员URL编码器 邮递员URL编码器是一个NodeJS模块,提供了各种与URL编码相关的API。 创建该模块是为了实现以消除跨Postman系统对Node URL API的依赖。 这些API可用于编码URL的不同部分(例如主机名,路径,查询)...
xss xssencode 16 10 url js xss xssencode 16 10 url js
调用下述HTTP接口,path参数填写URL Encode之后的第 2 步中的文件绝对路径: ``` http://localhost:8080/parseXlsx?path=path ``` 3. 文件读取结果将以接口响应的形式(application/json)返回 4. 响应结果:{...
hexencode 将字符串指定字符集进行编码成16进制字符串 hexstring 将字符串指定字符集进行编码成16进制字符串 power 求数字的幂函数 replace 将指定字符串中的源字符替换为目标字符 todec 将指定进制的数字转换成10...
字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c# 字符串转EnCode_c#
FFRouter 是 iOS 中一个强大且易用的 URL 路由库,支持 URL Rewrite,使... 支持 Rewrite 时获取原 URL 参数或 URLComponents,并可对其进行URL Encode或 Decode 支持通过 URL 获取 Object 支持 Route URL 时传递非常