javaservlet乱码问题_[java]servlet乱码问题解决
后台获取url参数乱码: 饿汉式
url?name=⽑台
解决: l⾥配置URIEncoding=UTF8
后台获取post body乱码:
servletRequest.setCharacterEncoding("UTF-8");
回显到浏览器乱码:
//设置服务器的字符串编码
servletResponse.setCharacterEncoding("UTF-8");
//设置客户端的字符串显⽰编码。
servletResponse.setContentType("text/html;charset=utf-8");
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
//设置服务器的字符串编码
servletResponse.setCharacterEncoding("UTF-8");
//设置客户端的字符串显⽰编码。
servletResponse.setContentType("text/html;charset=utf-8");
}
@Override
public void destroy() {
}
}
⼀、Get⽅式的中⽂乱码
使⽤如下页⾯表单内容:
⽤户名:
密 码:
获取表单内容代码:
控制台打印乱码内容:
4) 乱码的根本原因是什么呢?
url编码处理(打开tomcat下doc⼯程/index.html⽂件——Configuration—-HTTP 搜索 URIEncoding)
解决乱码的核⼼代码:
解决乱码的核⼼思路,就是把得到的乱码按照原来乱码的步骤逆序操作。
1、先以iso-8895-1进⾏解码
2、然后再以utf-8进⾏编码
第⼀种⽅式 使⽤URLEncoder 和 URLDecoder 两个类 编解码
如:
//获取客户端传递过来的⽤户名参数值
String username = Parameter("username");
System.out.println("⽤户名:" + username);
// 先对⽤户名进⾏解码得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式
username = de(username, "ISO-8859-1");
// 再进⾏utf-8编码 ⼀次得到页⾯上输⼊的⽂本内容
username = URLDecoder.decode(username, "UTF-8");
System.out.println("乱码解决后⽤户名:" + username);
第⼆种⽅式 使⽤ String类的⽅法进⾏编解码
username = new Bytes("ISO-8859-1"), "UTF-8"); System.out.println("乱码解决后⽤户名:" + username);
解决乱码的代码如下:
public class Params2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取客户端传递过来的⽤户名参数值
String username = Parameter("username");
System.out.println("⽤户名:" + username);
// 先对⽤户名进⾏编码得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式// username = de(username, "ISO-8859-1");
//再进⾏utf-8解码 ⼀次得到页⾯上输⼊的⽂本内容
// username = URLDecoder.decode(username, "UTF-8");
// System.out.println("乱码解决后⽤户名:" + username);
// 先iso-8859-1编码,再utf-8解码
username = new Bytes("ISO-8859-1"), "UTF-8"); System.out.println("乱码解决后⽤户名:" + username);
// 获取密码
String password = Parameter("password");
System.out.println("密码:" + password);
}
}
⼆、POST请求中⽂参数值乱码问题解决
post请求⽅式乱码的原因是:
因为post是以⼆进制流的形式发送到的服务器。服务器收到数据后。
默认以iso-8859-1进⾏编码。
POST请求乱码解决,只需要在获取请求参数之前调⽤
request.setCharacterEncoding(“UTF-8”); ⽅法设置字符集 即可。
如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.post请求⽅式的数据是以⼆进制流的形式发送到服务器。
// 2.那么就说明它缺少⼀个字符集。所以我们要设置请求体的字符集即可。
// setCharacterEncoding必须要获取请求参数之前调⽤才有效
request.setCharacterEncoding("UTF-8");
//获取客户端传递过来的⽤户名参数值
String username = Parameter("username");
System.out.println("⽤户名:" + username);
}
三、输出中⽂到客户端的乱码解决⽅法
(1)、输出字符串内容到客户端
往客户端输出。分两个步骤:
第⼀步:先获取输出流(⼆进制返回⽤获取字节流,字符出获取字符流)
第⼆步:调⽤输出流对象,写出数据第客户端
如:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 通过response响应对象获取到字符输出流
Writer writer = Writer();
// 往 客户 端 输出数据。
writer.write("this is response content!");
}
但是:输出中⽂到客户端的乱码解决⽅法
1) 如果拿到writer字符输出流。直接输出中⽂内容返回到客户端。会得到乱码。⽐如:
程序如下,客户端收到会有乱码情况:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 通过response响应对象获取到字符输出流
Writer writer = Writer();
// 往 客户 端 输出数据。
// writer.write("this is response content!");
// 输出中⽂数据到客户端
writer.write("这是中⽂的输出");
}
通过浏览器访问后显⽰的结果:
遇到这种情况是什么原因呢?
主要是因为服务器输出的字符串的编码和客户端显⽰字符串的编码不⼀致。导致乱码问题。所以我们只需要设置服务器和客户端的编码相同就可以解决这个问题。
乱码的解决。
设置服务器的字符串编码
//设置服务器输出的编码为UTF-8
response.setCharacterEncoding("UTF-8");
//告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
response.setContentType("text/html;charset=utf-8");
这两⾏语句要在获取输出流之前执⾏。才会⽣效。
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//设置服务器输出的编码为UTF-8
response.setCharacterEncoding("UTF-8");
//告诉浏览器输出的内容是html,并且以utf-8的编码来查看这个内容。
response.setContentType("text/html; charset=utf-8");
// 通过response响应对象获取到字符输出流
Writer writer = Writer();
// 往 客户 端 输出数据。
// writer.write("this is response content!");
// 输出中⽂数据到客户端
writer.write("这是中⽂的输出");
}
再次通过浏览器访问。得到的是正确的中⽂。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论