3行代码轻松搞定JavaWeb中的的乱码问题,浏览器端、服务器端统一UTF-8字符集!

本文深入解析Web应用中常见的乱码问题,包括请求参数乱码和响应参数乱码,阐述了乱码产生的原因及解决方案,重点介绍了如何通过统一字符集编码来避免乱码,特别是在GET和POST请求中的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 任何数据在计算机内部实际上都是以二进制的形式保存的,所以我们看得见的字符本质上都是以二进制的形式保存的。而字符集实际上就是看得见的字符和二进制数之间的一张对应表。
  Web应用中的乱码问题主要对于请求【参数】乱码和响应【参数】乱码而,解决乱码问题的根本方法就是统一编码和解码的字符集。

核心代码☟
//设置服务器编码
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>  
//设置服务器解码
request.setCharacterEncoding("UTF-8");
//设置服务器、浏览器解码
response.setContentType("text/html;charset=UTF-8");
1."三码"概念

  编码:将字符转换为二进制数。

  解码:将二进制数转换为字符。

  乱码:编码与解码使用的字符集不一致就会产生乱码。

2.服务器与浏览器默认编码与解码
服务器(如Tomcat)浏览器
编码ISO-8859-1(不支持中文)meta charset=“UTF-8”
解码ISO-8859-1(不支持中文)GBK(支持少量中文)
3.请求乱码

(浏览器<存在中文>---->服务器)浏览器编码的字符集与服务器解码的字符集不一致。

3.1.Get请求乱码【设置服务器编码】

  (1)解决方案:设置url位置的解码问题。

  (2)应用实施:修改Tomcat服务器的server.xml,添加字符集"URIEncoding=“UTF-8”

方式一(本地定位路径进行修改) :

在这里插入图片描述

方式二(在工具中直接定位修改) :

  (1)在eclipse或STS中的Tomcat镜像中修改即可生效。但如果将来删除当前Tomcat镜像,重新关联Tomcat,则会使设置失效,所以在Tomcat配置文件中最好也进行配置

在这里插入图片描述

  (2)第65行代码,添加“URIEncoding="UTF-8”即可,保存!

在这里插入图片描述

3.2.Post请求乱码 【设置服务器解码】

  (1)解决方案:将服务器的解码设置为:UTF-8(因为浏览器默认编码为:UTF-8) 。

  (2)应用实施:代码行中添加request.setCharacterEncoding(“UTF-8”)。

原理小结:

  对于GET请求:GET请求是在URL地址栏中传递请求参数的,它会被Tomcat服务器自动解码,而Tomcat服务器默认的字符集也是ISO-8859-1,所以我们需要修改Tomcat服务器的字符集为UTF-8。由于请求参数是包含在请求行内的,无法通过request对象进行设置,所以需要在Server.xml文件中修改Connector标签,添加URIEncoding="utf-8"属性。


  对于POST请求:post请求在Servlet中解码,默认的字符集是ISO-8859-1,不支持中文,所以我们需要修改Servlet的字符集为UTF-8。使用request.setCharacterEncoding(“UTF-8”);设置request对象使用UTF-8字符集对请求体中的内容进行解码。但需要注意的是,这个操作一定要在调用getParameter()方法之前进行。

4.响应乱码【设置浏览器解码】

(服务器<存在中文>---->浏览器)服务器编码的字符集与浏览器解码的字符集不一致。

  (1)方式一

  解决方案:将服务器编码设置为GBK(不建议) 。

  应用实施:代码:response.setCharacterEncoding(“GBK”)。

  (2)方式二

  解决方案:将服务器编码与浏览器解码设置UTF-8 。

  应用实施:代码行中添加response.setContentType(“text/html;charset=UTF-8”)(设置响应的内容类型)。

5.代码应用

自定义的一个servlet文件(java文件)

package com.codinglin.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EncodingServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public EncodingServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	//(1)如果html中的method="get"
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置服务器解码
		request.setCharacterEncoding("UTF-8");
		//设置浏览器、服务器解码
		response.setContentType("text/html;charset=UTF-8");
	}

	//(2)如果html中的method="post"
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
		//设置服务器解码
		request.setCharacterEncoding("UTF-8");
		//设置浏览器、服务器解码
		response.setContentType("text/html;charset=UTF-8");
	}

}

注意,添加解决乱码的代码这个操作一定要在调用getParameter()、response.getWriter()方法之前进行,。

说明:服务器编码(UTF-8)需要在Tomcat等服务器中手动修改server.xml,这里就不再赘述!


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.youkuaiyun.com/  欢迎转载,一起技术交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值