今天是2015年10月11日今天遇到的问题是前后台转码问题,找了好多的资料,现在总结一下,以备后用:
在java中
1:要想解码,首先需要编码。在java中有java.net.URLEncoder是 HTML 格式解码的实用工具类。里面有publicstatic String encode(String s, String enc)方法
参数:
s- 要转换的String。
enc- 所支持的字符编码名称。
使用指定的编码机制将字符串转换为application/x-www-form-urlencoded 格式。该方法使用提供的编码机制获取不安全字符的字节。
2:开始解码。在java中有java.net.URLDecoder是 HTML 格式解码的实用工具类,里面有publicstatic String decode(String s,String enc)方法
参数:
s- 要解码的String
enc- 所支持的字符编码的名称。
使用指定的编码机制对application/x-www-form-urlencoded 字符串解码。给定的编码用于确定任何"%xy" 格式的连续序列表示的字符。
这里使用编码和解码要注意一点,解码需要解码两次,下面这位作者的文章给出原因,写的非常棒!
http://m.blog.csdn.net/blog/taotaotaotao910429/8626421
在js中
原文地址http://www.cnblogs.com/andiki/articles/1399720.html
一、定义和用法
encodeURI() 函数可把字符串作为 URI 进行编码。
语法
encodeURI(URIstring)
参数 | 描述 |
URIstring | 必需。一个字符串,含有 URI 或其他要编码的文本。 |
返回值
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
提示和注释
提示:如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。
此方法的解码为decodeURI()
二、定义和用法
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
语法
escape(string)
参数 | 描述 |
string | 必需。要被转义或编码的字符串。 |
返回值
已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。
提示和注释
提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。
注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。
三、JavaScript encodeURIComponent() 函数
定义和用法
encodeURIComponent()函数可把字符串作为 URI 组件进行编码。
语法
encodeURIComponent(URIstring)
参数 | 描述 |
URIstring | 必需。一个字符串,含有 URI 组件或其他要编码的文本。 |
返回值
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
提示和注释
提示:请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。
此方法解码方式decodeURIComponent
3.Java和js混合
一种方式
/*
* 在前台要先双编,在后台取在解
* js代码
* var str = "中文";
* str =encodeURI(str); 1编
* str =encodeURI(str); 2编
* java代码
* String content =request.getParameter("str");
* content =java.net.URLDecoder.decode(content, "UTF-8"); 解码
*/
二种方式
String content = newString(request.getParameter("loginid").getBytes("ISO-8859-1"),"UTF-8");直接写;
三种方式ajax提交
js:
encodeURIComponent(encodeURIComponent(value));
java:
URLDecoder.decode(value,"UTF-8");
其它的就要看乱码情况来解决eg:过滤器
javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent()。这几种编码所起的作用各不相同。 escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。不会被此方法编码的字符: @ * /+encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( )= : / ; ? + 'encodeURIComponent() 方法: 把URI 字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) ' 因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent()。这几种编码所起的作用各不相同。 escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。不会被此方法编码的字符: @ * / +encodeURI()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + 'encodeURIComponent()方法: 把URI 字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) ' 因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。