【解决URL路径编码乱码】
@Test
public void test() throws Exception {
String text = "中国";
// 进行URL编码操作
String encode = URLEncoder.encode(text, "utf-8");
System.out.println("编码后的结果:" + encode);
// 进行URL解码操作
String str = URLDecoder.decode(encode, "utf-8");
System.out.println("解码后的结果:" + str);
}
【参数的乱码问题】
编码操作:
字符串 --> 编码
byte[] data = str.getByte("utf-8");
解码操作:
编码 --> 字符串
String str = new String(data, "utf-8");
GET方式:
参数是在URL中的(请求行中)。
解决方案一:
// 获取参数,默认是使用iso8859-1进行解码(iso8859-1字符集支持中文吗?不支持)
String name = request.getParameter("name");
// 解决GET方式中文参数的乱码问题,注意:本方法只对GET方式有效
// 第二个参数(编码)应根据情况设置为GBK或UTF-8或其他.
// 具体的是指定浏览器传参数时所用的编码,就是浏览显示的网页所用的编码。
// (网页显示的是什么编码,那么传参数就用什么编码)
name = new String(name.getBytes("iso8859-1"), "utf-8");
解决方案二:
// 在conf/server.xml中配置request.getParameter()的默认使用的编码为正确的编码
<Connector
connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="utf-8"
/>
POST方式:
参数是在请求的实体内容中。
解决方案:
// 设置请求的实体内容编码(默认是iso8859-1)
// 这样POST方式提交的参数中的中文就不会有乱码了
// 注意1:此方案只对POST方式的参数乱码问题有效!
// 注意2:此代码一定要放到所有的getParameter()调用之前才有效
request.setCharacterEncoding("utf-8");
具体代码:
package itcast.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyParServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
byte[] bytes = name.getBytes("iso8859-1");
name = new String(bytes, "utf-8");
String sex = request.getParameter("sex");
sex = new String(sex.getBytes("iso8859-1"),"utf-8");
System.out.println("name="+name+" sex="+sex);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
System.out.println("name="+name+" sex="+sex);
}
}