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的响应方法前使用,否则无效