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");

更多相关文章

  1. 忽略转义字符时拆分字符串
  2. 使用字符串参数调用AndroidJni静态方法。
  3. java中匹配字符串中的中文字符(含中文标点的)
  4. Java中字符流和字节流到底有什么区别!!!
  5. java GBK字符转换成为UTF-8编码字符
  6. String字符串的应用
  7. java 正则表达式查找某段字符串中所有小写字母开头的单词并统计
  8. Javascript 检查字符串是否是数字的几种方法
  9. JavaWeb中GET请求url传参中文乱码问题

随机推荐

  1. 疫情防控不能松懈,利用数据挖掘做好重点区
  2. python六大数据类型
  3. 黑科技神器-uTools
  4. Drawable、Bitmap、Canvas和Paint的区别
  5. 栈的应用(运算问题)
  6. 性能优化技巧:外键序号化
  7. RocketMQ 源码分析 —— Message 顺序发
  8. 芋道 Spring Boot SpringMVC 入门
  9. 芋道 Spring Boot 参数校验 Validation
  10. 程序员写简历时必须注意的技术词汇拼写(持