[关闭]
@duyao 2015-04-23T01:05:25.000000Z 字数 2372 阅读 2939

中文乱码

servlet

发生中文乱码有3种情况

表单提交

post

一般浏览器的编码为utf-8,而web服务器(tomcat)为iso-8859-1,因此提交时就会产生乱码,故设置request
request.setCharacterEncoding("utf-8");//gbk,gb2312,big5

get

对于get方法,内容封装到请求行中,因此设置请求体无效

  1. //将方法写成工具类
  2. //String name=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
  3. public static String getNewString(String str){
  4. String newString="";
  5. try {
  6. newString= new String(str.getBytes("iso-8859-1"),"utf-8");
  7. } catch (UnsupportedEncodingException e) {
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. }
  11. return newString;
  12. }

超链接

<a herf="url?name=nameString">test</a>
超链接的传输同get方法相同,因此get的解决方法就可以解决超链接问题

  1. //将方法写成工具类
  2. //String name=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
  3. public static String getNewString(String str){
  4. String newString="";
  5. try {
  6. newString= new String(str.getBytes("iso-8859-1"),"utf-8");
  7. } catch (UnsupportedEncodingException e) {
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. }
  11. return newString;
  12. }

sendRedirect()

response.sendRedirect("/userManager/MainFrame?name=你好");

  1. //接受时,对responce进行解码
  2. response.setContentType("text/html;charset=utf-8");
  3. String newString=new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");
  4. PrintWriter out = response.getWriter();
  5. out.print(newString);

下载的文件名中文乱码

使用URLEncoder.encode转码报头response.setHeader()

  1. package com.dy.http;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. public class Download extends HttpServlet {
  5. /**
  6. * 演示页面下载功能,使用Content-Disposition关键字
  7. */
  8. public void doGet(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. response.setContentType("text/html;charset=utf-8");
  11. //getWriter和getOutputStream不能同时出现
  12. //PrintWriter out = response.getWriter();
  13. //下载文件的报头
  14. //文件名为中文,下载会出现乱码,只需要修改header
  15. String tmp=URLEncoder.encode("图片.jgp","utf-8");
  16. response.setHeader("Content-Disposition", "attachment;filename="+tmp);
  17. //1.获取全路径,路径不需要转码
  18. String path=this.getServletContext().getRealPath("/image/图片.jpg");
  19. //System.out.println(path);
  20. //2.创建文件输入流,这样才可以下载
  21. FileInputStream fis=new FileInputStream(path);
  22. //创建缓冲
  23. byte [] buffer=new byte[1024];
  24. //每次实际读出多少比特
  25. int len=0;
  26. OutputStream os=response.getOutputStream();
  27. while((len=fis.read(buffer))>0){
  28. os.write(buffer, 0, len);
  29. }
  30. //关闭流
  31. os.close();
  32. fis.close();
  33. }
  34. public void doPost(HttpServletRequest request, HttpServletResponse response)
  35. throws ServletException, IOException {
  36. this.doGet(request, response);
  37. }
  38. }

总结

尽量使用post提交
在服务器端是中文,也要考虑浏览器是否是中文
response.setContentType("text/html;charset=utf-8");

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注