博客文章已经迁移:http://www.arm4u.com/read.php?tid=36
J2EE开发中,乱码问题一直都萦绕在程序员的开发过程当中。但是只要我们对各种乱码出现的情况进行分析、总结,问题就能迎刃而解。
解决这类问题,通常需要思考以下问题:
1、在什么情况(如软件环境等)下产生了乱码?
2、数据来源时的编码方式是什么?在当前环境下处理这些数据(如正常显示)需要进行什么样的转码?
3、数据被使用后,需要通过什么编码方式处理才能在转发后避免乱码的发生?
问题一:通过Http请求的URL地址传递参数(Form表单Get()方式提交)
假设,URL中的访问地址为:【http://127.0.0.1:8080/myweb/TestServlet?name=琳达】。“myweb”是我们在服务器端发布的web应用的名称,“TestServlet”是具体的Servlet的名称,问号后的“name”是向服务器端传递的参数,“琳达”是参数“name”所对应的值。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname = request.getParameter("name"); System.out.println(uname);//打印时在控制台出现乱码 // 省略 }
说明:
在Servlet中,通过Servlet提供的HttpServletRequest对象的getParameter()方法来获取客户端请求的内容。通过URL请求的方式(即get()方式)传递参数时,getParameter()方法进行自动URL解码采用的编码方式取决Servlet引擎Tomcat默认用iso8859-1(或者ISO-8859-1)进行编码。
在这里,尤其要注意的是通过Http请求的URL中自带参数进行访问提交到服务器属于Get()传送,就是把数据串在请求的URL后面作为参数。当访问地址该地址后,浏览器会对URL进行URL encode(即对URL进行编码),然后发送给服务器。
代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname = request.getParameter("name"); System.out.println(uname);//乱码 if(uname!=null){ //将uname的值通过原来的编码方式(ISO-8859-1)转换成可显示中文的编码(GB2312) uname=new String(uname.getBytes("ISO-8859-1"),"GB2312"); }else{ uname="游客"; } System.out.println(uname);//输出中文“琳达” // 省略 }
问题二:Form表单Post()方式提交
假设,在index.html文件中存在一个Form表单,提交方式为Post()方式。表单中有一个元素<input name="name" value="琳达" type="text" />。通过Form表单提交至服务器端的Servlet来处理业务,其中很重要的一点就是在Servlet中如何准确获取Form表单提交的内容,比如表单中名称为“name”的值。
<form name="Name" action="TestServlet" method="post"> <input name="name" value="琳达" type="text" /> <input type="submit" name="Submit" value="GO"> </form>
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname = request.getParameter("name"); System.out.println(uname);//打印时在控制台出现乱码 // 省略 }
说明:
Post()提交方式下,传递参数也需要进行URL encode,编码方式取决于页面中的<meta http-equiv="Content-Type" content="text/html; charset=字符集GBK,utf-8等"/>。这个属性除了说明此网页在浏览器下是通过什么编码进行网页的解释之外,Post()方式下会用此处定义的编码方式进行编码而后提交到服务器。如果请求的页面是JSP,则<%@ page language="java" import="java.util.*" pageEncoding="GBK,utf-8等"%>可进行相应的配置。
在讲解Get()处理方式中,我们用了强制转码的方式解决乱码问题,但是通过Post()提交方式Servlet提供了解决方案:request.SetCharacterEncoding("字符集");方法。
代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //请求的页面设置了GBK方式进行编码,那么通过request来设置获取的对应编码 request.setCharacterEncoding("GBK"); String uname = request.getParameter("name"); System.out.println(uname);//正常的文字 // 省略 }
本文讲解了如何对客户端发送的数据进行正常的解码方式,主要通过Get()和Post()为主的两种提交方式在服务器端对乱码的不同处理来帮助大家理解乱码产生的原因和通俗的解决方式。今后还会做更加详细、深入的探讨,比如Servlet对Get()和Post()为何要做不同处理?是否还有其他方式来解决这个问题?
期待大家的关注,也希望得到宝贵的建议。