zoukankan      html  css  js  c++  java
  • URLEncoder.encode、URLDecoder.decode、escape、encodeURI、encodeURIComponent

    escape()方法

    采 用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符 在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20,如果是中文,则使用unicode编码格式如 %uxxxx。unescape方法与此相反。不会被此方法编码的字符有69个: @*_+-./ ,0-9,a-z,A-Z

    encodeURI() 方法

    把URI字符串采用UTF-8编码格式转化成escape格式的字符串。encodeURI不编码字符有82个 : ~!@#$&*()_+:?-=;',./,0-9,a-z,A-Z

    encodeURIComponent() 方法

    把 URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符71个 : ~!*()_-'.,0-9,a-z,A-Z

    POST方式下的特殊字符转换

    随便说说表单以POST方式提交时,表单元素值中的一些字符也会转换,但以下不做转换 : +@*_-. ,a-z A-Z 0-9 , 要转换的字符会先用浏览器的编码方式时行编码,然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。

    Java中的URLEncoder.encode(String s, String enc) /URLDecoder.decode(String s, String enc)编码方式

    Java中的URLEncoder.encode(String s, String enc) /URLDecoder.decode (String s, String enc)机制:它们与JavaScript中的encodeURI、encodeURIComponent函数在编码方式上是不一样的。 encodeURI、encodeURIComponent用的是UTF-8,是不能更改的。但Java里的编解码函数不一定是UTF-8,这里的编码与 运行的环境是有关系的,默认情况下,在Tomcat5.5下是以ISO8859-1来解码URL中传递过来的参数的,但也可以设置URL的编码方式,比如 Tomcat中设置URIEncoding与useBodyEncodingForURI属性是可以的,具体实例请看 《HTTP码流与Jsp乱码问题的分析(一)》 中的URLEncoder.encode()部分。

     

    URLEncoder.encode(String s, String enc) 对 String 编码时,使用以下规则:

    • 字母数字字符 "a " 到 "z "、"A " 到 "Z " 和 "0 " 到 "9 " 保持不变。
    • 特殊字符 ". "、"- "、"* " 和 "_ " 保持不变。
    • 空格字符 " " 转换为一个加号 "+ "。
    • 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy " 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

    例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

    URLDecoder.decode(String s, String enc) 转换过程正好与 URLEncoder 类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"a " 到 "z "、"A " 到 "Z "、"0 " 到 "9 " 和 "- "、"_ "、". " 以及 "* "。允许有 "% " 字符,但是将它解释为特殊转义序列的开始。

    转换中使用以下规则:

    • 字母数字字符 "a " 到 "z "、"A " 到 "Z " 和 "0 " 到 "9 " 保持不变。
    • 特殊字符 ". "、"- "、"* " 和 "_ " 保持不变。
    • 加号 "+ " 转换为空格字符 " "。
    • 将把 "%xy " 格式序列视为一个字节,其中 xy 为 8 位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。

    注:以下代码中的Cookie中写入中文必须先URLEncoder.encode编码,在读取Cookie时用URLDecoder.decode编码后转化为中文

    <%
    String name = "css枯黄";
    Cookie ck = new Cookie(URLEncoder.encode("username"),URLEncoder.encode(name));
    ck.setMaxAge(24*1000);
    response.addCookie(ck);
    out.println("写入Cookie完毕");


    Cookie[] cookies = request.getCookies();
    for(Cookie c:cookies){
    if(c.getName().equals("username"))
    {
    out.println(URLDecoder.decode(c.getValue()));
    }
    }
    %>

    原文:http://hi.baidu.com/suofang/item/40135d26e992820876272cea

  • 相关阅读:
    Uri编码,包括javascript前端与C#服务器端
    HttpWebResponse类
    HTTP报文
    HTTP权威指南阅读记录
    XMPP通讯开发-1
    开源安卓播放器:Dolphin Player 简单分析
    Spring MVC框架
    Median of Two Sorted Arrays (找两个序列的中位数,O(log (m+n))限制) 【面试算法leetcode】
    C语言指针5分钟教程
    2013中国互联网安全大会---关于季昕华老师的分享(不喜请勿入!)
  • 原文地址:https://www.cnblogs.com/veins/p/4083873.html
Copyright © 2011-2022 走看看