1、问题的引入

    浏览器访问服务器时,如果浏览器发出的请求参数中包含中文,而服务器获取时会出乱码。这就是中文乱码的问题
    这是因为浏览器负责编码,这是由页面的编码格式决定的【charset=”utf-8”】;服务器负责解码,这是由服务器的编码格式决定的。而tomcat服务器的默认编码是ISO-8859-1。编码格式和解码格式不匹配,所以导致了乱码的出现

    tomcat服务器的编码格式决定了request和response对象的方法的编码格式。所以可以通过一些设置来修改默认的编码

2、获取的请求参数是乱码

⑴ POST请求
① 方式一
    首先将请求参数转换为指定编码【服务器的编码】的byte数组,然后再调用String的构造方法,将byte数组转换为指定编码【一般为utf-8】的字符串

示例:
String name = request.getParameter(“name”); // 获取name请求参数
byte[] bytes = name.getBytes(“ISO-8859-1”); // 用ISO-8859-1【tomcat的默认编码】对获取的请求参数进行解码
name = new String(bytes, “utf-8”); // 再用utf-8对byte数组进行编码

② 方式二
    通过调用request的setCharacterEncoding方法

public void setCharacterEncoding(String env);

需要传入编码格式字符串。推荐使用该方法
注意:
    ⒈ 该方法必须在获取请求参数前被调用,否则无效
    ⒉ 该方法只针对调用过该方法设置过编码格式的Servlet,获取POST的请求参数有效

⑵ GET请求
    通过修改tomcat的server.xml配置文件来修改tomcat的默认编码。找到Connector节点,并在其中添加一个属性:URIEncoding=”指定的编码”
Tips:通过修改server.xml配置文件的方式对所有的GET请求都有效

例如:

<Connector URIEncoding="UTF-8" ... />

这里就将tomcat服务器的默认编码改为了UTF-8

3、响应的内容是乱码

通过响应头来告诉浏览器要使用哪种编码格式,来解析服务器给与的响应信息

    Tips:HTML页面一般没有乱码,因为head标签中有meta标签,它有一个charset属性,设置了HTML页面的编码格式。这样就告知了浏览器要使用哪种编码格式来解析HTML页面。
    而单纯地通过response.getWriter().write(“”)的方式来给与浏览器以响应,默认是不会告诉浏览器使用哪种编码格式来解析这句话的

① 方式一
调用response的setHeader()方法

public void setHeader(String name, String value);

设置指定的响应头(键值对)。根据指定的key来设置对应的value。
这里的key就是”Content-Type”。value就是要设置的字符编码

示例: response.setHeader(“Content-Type”, “text/html;charset=UTF-8”);
告诉浏览器以UTF-8编码格式来解析服务器的响应体中的内容

② 方式二
这里使用response的setContentType()方法

public void setContentType(String type);

需要传入一个编码字符串。例如修改编码为UTF-8,则需要传入:”text/html;charset=UTF-8”

例如:
response.setContextType(“text/html;charset=UTF-8”);
修改响应编码为UTF-8

注意:该方法需要在调用response的响应方法前使用,否则无效