服务器响应到客户端中文乱码的解决方式
当服务器向浏览器发送响应页面时,有时候因为码表的查询不一致,会在浏览器出现乱码问题。比如说服务器中我使用的是UTF-8
,而浏览器默认是查询本地码表,注意如果是中文系统则使用的是GBK码表
。造成了码表查询不一致,会出现乱码的情况。服务端发出的响应,有字节流和字符流两种方式向浏览器发送页面信息。关于浏览器出现乱码问题见下图:
解决字节流或者字符流的乱码问题,可以通过HTTP
响应头,或者是在HTML
页中的<META>
标签中等想客户端发送消息,让客户端以什么方式解码。以下是分别在Servlet
类中对字节流或者是字符流进行中文乱码处理。
字节流
对于字节流中,out.write(“
中文”.getByte(“utf-8”)),
在浏览器中会出现乱码问题。
1. 第一种解决方式:用户更改浏览器的解码方式。此种方式不可取。
2. 通过HttpServletResponse对象,模拟HTTP协议的响应消息头来通知浏览器使用什么码表来进行查询解码。
a) 通过response.setHeader("Content-Type","text/html;charset=UTF-8");来通知浏览器解码方式。
b) 模拟HTML页面的<meta>标签:如下示例代码:
String meta="<meta http-equiv='Content-Type'content='text.html;charset=utf-8'>";
resp.getOutputStream().write(meta.getBytes());
c) response.setContentType("text/html;charset=UTF-8")的方式来通知浏览器的解码方式。
字符流
注意了,在Servlet
规范中要求,当使用字符流向浏览器发送页面信息时,默认查询的是ISO-8859-1码表。
对于如下代码发送中文时有几种解决方式:
PrintWriter out=resp.getWriter();
out.print(
"
中文
"
);//
默认以
ISO-8859-1
编码。
a) 可以直接设置resp.setCharacterEncoding("GBK");以GBK方式编码
b) 当设置resp.setCharacterEncoding("utf-8")编码输出时,可以使用字节流的通知客户端以utf-8解码显示几种方式解决。
i. response.setHeader("Content-Type","text/html;charset=UTF-8");
ii. response.setContentType("text/html;charset=UTF-8");
客户端请求服务器出现的中文乱码解决方式
当浏览器在表单填写中文参数时,发回到服务器收到的参数信息是乱码,这样在封装参数信息时,会出现错误。那么怎么解决中文的请求参数乱码问题呢?由于表单提交有两种方式,(GET和POST)。所以在处理中文的乱码问题也有所不同。
POST方式
1. 浏览器当前使用什么编码,表单提交的参数就是什么编码。这里服务器可以有多种方式去通知浏览器的编码方式。HTML中的meta标签可以这样做。示例代码如下:
<metahttp-equiv="content-type" content="text/html;charset=UTF-8">。
但是这样并不能解决问题,需要通知程序,客户端提交的数据使用的编码。需要在接受参数的Servlet类中添加这段代码:request.setCharacterEncoding("utf-8");
如果向客户端发出响应可能还需要添加如下代码才能在结果页面出现中文:
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
GET方式
如果是GET
请求提交数据,编码采用的ISO-8859-1
。就不能使用上述的解决办法。这时需要在服务器端的Servlet
类中先将其以ISO-8859-1
进行解码,再使用utf-8
进行编码。示例代码如下:
String name=request.getParameter("name");
name=new String(name.getBytes("iso-8859-1"),"utf-8");