`

URL encode

    博客分类:
  • j2ee
阅读更多

个人技术博客: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 字符串

string   urlencode   (  string   $str   )

返回字符串,此字符串中除了  -_.   之外的所有非字母数字字符都将被替换成百分号(% )后跟两位十六进制数,空格则编码为加号(+ )。此编码与 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

 

分享到:
评论

相关推荐

    URL encode 与 URL decode 的C语言实现.zip

    为了解决这个问题,URL编码(URL encode)和解码(URL decode)机制应运而生。这个压缩包文件"URL encode 与 URL decode 的C语言实现.zip"显然提供了用C语言编写的函数,用于对URL进行编码和解码操作。 URL编码是一...

    java net unicode / native2ascii / url decode / url encode / UTF8 / js url code

    标题中的“java net unicode / native2ascii / url decode / url encode / UTF8 / js url code”涉及了Java网络编程中的几个关键概念,这些概念在处理字符编码时非常重要。以下是对这些概念的详细解释: 1. **...

    JavaScript的URL encode decode源代码,ip验证,TRim

    在标题提到的“JavaScript的URL encode decode源代码,ip验证,TRim”中,我们将探讨这三个关键概念。 1. URL编码与解码: 在JavaScript中,我们经常需要对URL中的特殊字符进行编码,以确保它们在HTTP请求中被正确...

    网址编码解码,jQuery版Url.encode,Url.decode,Url.parse.rar

    网址编码解码,jQuery版Url.encode,Url.decode,Url.parse,一个来自jQuery的URL Decoder解码、编码插件,为你的URL安全定义一道安全防线,示例文件本身就是一个值得学习的实例,自带的示例将告诉你如何使用这款URL...

    PB 进制转换 url编码 urlencode urldecode 数组排序

    hexencode 将字符串指定字符集进行编码成16进制字符串 hexstring 将字符串指定字符集进行编码成16进制字符串 power 求数字的幂函数 replace 将指定字符串中的源字符替换为目标字符 todec 将指定进制的数字转换成10...

    Arduino URLCode 编码解码解析 URL字符串

    使用这个库可以很方便的编码解码URLCode。里面带了ESP8266看门狗开关,可以在调用这个库之前宏定义ESP8266就可以开启库的看门狗设置。避免触发看门狗。建议配合我主页的教程一起食用。哪怕是小白也可以轻松使用。

    Url Encode Decode

    C++的UrlEncode UrlDecode代码。

    linux c++ url和base64编解码

    linux系统c++实现的url和base64编解码 在webserver中会使用 自己实现的一个webserver,详见https://download.csdn.net/download/k117470154/10234299

    Fiddler之HTTP协议缓存、压缩与URL Encode

    URL编码(URL Encode)是HTTP协议中处理特殊字符的一种方法。URL中不能包含某些字符,如空格、百分号等,因此需要将它们转换为 `%xy` 的形式,其中`xy`是字符的ASCII码的十六进制表示。例如,空格转换为 `%20`。在...

    用C++来实现UrlEncode

    URL编码是一种用于处理URL中特殊字符的技术,确保它们能在互联网上安全传输。在C++中实现这一功能涉及到对字符串的遍历、字符识别以及ASCII码与十六进制之间的转换。 #### 核心概念解析 1. **数字和字母不变**:在...

    Encode_ Decode Tools URL编码解码工具

    `Encode_ Decode Tools`是一款用于URL编码和解码的工具,它可以帮助开发者和用户方便地处理这些编码问题。这款工具可能提供了简单的用户界面,允许用户输入URL或字符串,然后点击按钮进行编码或解码操作。它支持对...

    网络传输文本,urlEncode和decode的实现。

    在实际应用中,`urlEncode`和`urlDecode`常用于构建和解析URL,特别是当URL中包含查询字符串时。例如,如果你要创建一个指向搜索引擎的链接,查询参数可能包含用户输入的数据,这些数据必须先编码再加入到URL中,以...

    HTML码URL-encode码转换器

    自己动手写了一个HTML码URL-encode码转换器,给大家分享一下。

    Laravel开发-urlencode

    在Laravel框架中,开发过程中可能会遇到需要处理URL编码的问题,特别是当路由参数包含特殊字符,如斜杠(/)时。`urlencode`函数在PHP中广泛用于将URL中的非字母数字字符转换为对应的百分号编码,以确保它们在HTTP...

    java中文乱码分析

    - **方法二**:在客户端对URL进行两次`URL encode`,服务器端进行一次`URL decode`。 #### 三、实践案例 以字符串“京AS8095”为例: - 客户端进行第一次`URL encode`:`%E4%BA%ACAS8095` - 客户端进行第二次`...

    HtmlEncode编码与解码用法定义

    除了HtmlEncode与HtmlDecode外,文中还提到了`UrlEncode`和`UrlDecode`的概念。这两个操作主要用于处理URL中的特殊字符,确保URL能够被正确解析并传输。 **UrlEncode**的目的是将URL中的特殊字符转换为对应的百分比...

    [工具查询]渝海URL编码转换工具 v1.1_yh_url_encode.zip

    【渝海URL编码转换工具 v1.1_yh_url_encode】是一个专用于处理URL编码问题的实用工具。在互联网通信中,URL(统一资源定位符)是用于标识资源的字符串,它包含网络协议、主机名、路径、查询参数等部分。然而,URL中...

    JS版 UrlEncode

    在Web开发中,URL编码(URL Encode)和URL解码(URL Decode)是处理字符串以确保它们能在URL中安全传输的重要操作。本文将深入探讨一个JavaScript版本的URL编码和解码函数实现,并分析其工作原理及应用场景。 #### 一、...

    使Nginx服务器支持中文URL的相关配置详解

    Nginx服务器支持中文URL的配置方法主要涉及服务器的字符集设置、Web服务器软件的配置以及客户端工具的字符集设置。在了解配置方法之前,先要了解为什么会有这样的需求以及中文URL的支持度问题。 SEO(搜索引擎优化...

Global site tag (gtag.js) - Google Analytics