真善美

勇于承担责任; 如果你做不到,要提前跟别人说明,不要等到事情发生后再解释。

  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  55 随笔 :: 0 文章 :: 29 评论 :: 0 Trackbacks
【转】http://jiangzhengjun.javaeye.com/blog/508079
客户端编码
:虽然采用的POST方式请求,但是参数是附加在URL后面的,结果就是附加在URL后面的参数还是以GET方式传递。又encodeURIComponent()函数是以UTF-8编码方式对内容进行编码,经过此函数编码后的附加参数的值就以UTF-8传送到服务器。
服务器解码:因为Tomcat的<Connector/>标签未设置URIEncoding与useBodyEncodingForURI这两个属性,所以Tomact对URL后的附加参数采用默认的编码方式ISO8859-1进行编码。
最后结论:客户端编码方式(UTF-8)与服务器解码方式(ISO8859-1)不同导致了乱码。

[转]http://jiangzhengjun.javaeye.com/blog/509605    
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乱码问题的分析(一)》(http://jiangzhengjun.javaeye.com/blog/508079)中的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 位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jjjsss82/archive/2009/12/13/4940513.aspx



JSP页面传值:
function doAdd()
{var url = "method=add&value="+encodeURI(frm.xx.value);
    var request = newXMLHttpRequest();
    request.onreadystatechange = getReadyStateHandler(request,alertResult);
    request.open("POST", "ssAction.do", true);
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=GBK");
    request.send(url);
}
Action取值:
    public String add(ActionForm form, HttpServletRequest request, HttpServletResponse response)
            throws IOException
    {
        response.setContentType("text/html; charset=GBK");
        PrintWriter write = response.getWriter();
        try
        {
            VO vo = new VO();
            vo.setValue(URLDecoder.decode(request.getParameter("value"),"utf-8"));
            write.print("success");
        }
        catch (Throwable e)
        {
            write.print("error:" + e.getMessage());
        }
        return null;
    }

jsp编码方式:浏览器中右键--编码-- UTF-8(默认)


posted on 2010-11-05 16:01 真善美 阅读(725) 评论(0)  编辑  收藏