Jsp以get方式提交中文及特殊字符,javascript处理乱码问题

时间:2022-02-24 11:01:36

Jsp页面get方式传递参数,Javascript方式处理进行编码,Servlet后台处理解决中文以及特殊符号乱码问题

JSP文件

<%@ page language="java" contentType="text/html; charset=utf-8"   pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function f(){
window.location.href="<%=request.getContextPath() %>/ChineseServlet?username="+encodeURIComponent(encodeURIComponent('中文#@$^&*=-+_'));
}

</script>
</head>
<body>
<a href="#" onclick="f()">get传递中文</a>
</body>
</html>

Servlet文件
public class ChineseServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String uname =request.getParameter("username");
String us = URLDecoder.decode(uname, "utf-8");
response.getWriter().println(us);
} catch (Exception e) {
e.printStackTrace();
}

} }

1. 第一,在JSP页面设置当前页面编码格式为支持中文编码,例如utf-8,gbk,gb2312等。

<%@ page language="java"contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>


2.  第二,在Javascript中二次使用encodeURIComponent对目标字符进行编码处理,使其成为符合要求的编码格式。

encodeURIComponent(encodeURIComponent('中文#@$^&*=-+_'));

 

使用encodeURIComponent,而不是encodeURI是为了根据需求解决特殊字符无法转码的问题。

 

(escape不编码字符有69个:*+-./@_0-9a-zA-Z

 

encodeURI不编码字符有82个:!#$&'()*+,-./:;=?@_~0-9a-zA-Z

 

encodeURIComponent不编码字符有71个:! '()*-._~0-9a-zA-Z)

 

 

为什么要二次使用encodeURIComponent呢?

 

因为服务器端tomcat会在你做解码之前自动先对URL做一次decode解码,所以客户端要编码两次,服务器端只解码一次就OK了。

 

如果只使用一次encodeURIComponent,会怎样呢?

 

如果只使用一次encodeURIComponent编码的话,则传递到Servlet的就是已经处理过的中文字符,而不是纯粹的ASCII字符

(此处应该是%E4%B8%AD%E6%96%87%23%40%24%5E%26*%3D-%2B_),自然而然,此时再进行

java.net.URLDecoder.decode("中文#@$^&*=-+_","utf-8");就不会得到正确的结果。

 

3.  第三,在Servlet中使用java.net.URLDecoder.decode("中文#@$^&*=-+_","utf-8");即可得到正确的结果,若输出到jsp页面显示则需要设置 

response.setCharacterEncoding("utf-8");