get-post-页面乱码分析和解决

1、Get方式的中文乱码
1) 使用以下页面表单内容:
[HTML] 纯文本查看 复制代码
?html

<form action="http://127.0.0.1:8080/day07/params" method="get">浏览器

用户名:<input name="username" type="text" /><br/>

    密 码:<input name="password" type="password" /><br/>

    <input type="submit" />

</form>
2) 获取表单内容代码:
图1 tomcat

3) 控制台打印乱码内容:
图2 服务器

4) 乱码的根本缘由是什么呢?
(打开tomcat下doc工程/index.html文件——Configuration—-HTTP 搜索 URIEncoding)
图3 post

解决乱码的核心代码:
解决乱码的核心思路,就是把获得的乱码按照原来乱码的步骤逆序操做。
一、先以iso-8895-1进行解码
二、而后再以utf-8进行编码
1) 第一种方式 使用URLEncoder 和 URLDecoder 两个类 编解码
如:
[Java] 纯文本查看 复制代码
?this

//获取客户端传递过来的用户名参数值编码

String username = request.getParameter("username");

System.out.println("用户名:" + username);



// 先对用户名进行解码获得%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式

username = URLEncoder.encode(username, "ISO-8859-1");



// 再进行utf-8编码 一次获得页面上输入的文本内容

username = URLDecoder.decode(username, "UTF-8");

System.out.println("乱码解决后用户名:" + username);
2) 第二种方式 使用 String类的方法进行编解码code

[Java] 纯文本查看 复制代码
?orm

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");[/align]htm

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 = request.getParameter("username");

System.out.println("用户名:" + username);

// 先对用户名进行编码获得%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式

//  username = URLEncoder.encode(username, "ISO-8859-1");

//再进行utf-8解码 一次获得页面上输入的文本内容

//  username = URLDecoder.decode(username, "UTF-8");

// System.out.println("乱码解决后用户名:" + username);

// 先iso-8859-1编码,再utf-8解码       

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");



System.out.println("乱码解决后用户名:" + username);



// 获取密码

String password = request.getParameter("password");

System.out.println("密码:" + password);

}

}
2、POST请求中文参数值乱码问题解决
post请求方式乱码的缘由是:
由于post是以二进制流的形式发送到的服务器。服务器收到数据后。
默认以iso-8859-1进行编码。
POST请求乱码解决,只须要在获取请求参数以前调用
request.setCharacterEncoding(“UTF-8”); 方法设置字符集 便可。
以下:
[Java] 纯文本查看 复制代码
?

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

// 1.post请求方式的数据是以二进制流的形式发送到服务器。

// 2.那么就说明它缺乏一个字符集。因此咱们要设置请求体的字符集便可。

// setCharacterEncoding必需要获取请求参数以前调用才有效

request.setCharacterEncoding("UTF-8");



//获取客户端传递过来的用户名参数值

String username = request.getParameter("username");

System.out.println("用户名:" + username);

}
3、输出中文到客户端的乱码解决方法
(1)、输出字符串内容到客户端
1) 往客户端输出。分两个步骤:
第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)
第二步:调用输出流对象,写出数据第客户端
如:

[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
protected void doGet(HttpServletRequest request,[/align]

HttpServletResponse response) throws ServletException, IOException {

// 经过response响应对象获取到字符输出流

Writer writer = response.getWriter();

// 往 客户 端 输出数据。

writer.write("this is response content!");

}
可是:输出中文到客户端的乱码解决方法
1) 若是拿到writer字符输出流。直接输出中文内容返回到客户端。会获得乱码。
好比:
程序以下,客户端收到会有乱码状况:

[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
protected void doGet(HttpServletRequest request,[/align]

HttpServletResponse response) throws ServletException, IOException {

// 经过response响应对象获取到字符输出流

Writer writer = response.getWriter();

// 往 客户 端 输出数据。

// writer.write("this is response content!");

// 输出中文数据到客户端

 writer.write("这是中文的输出");

}
经过浏览器访问后显示的结果:
图4

遇到这种状况是什么缘由呢?
主要是由于服务器输出的字符串的编码和客户端显示字符串的编码不一致。致使乱码问题。
因此咱们只须要设置服务器和客户端的编码相同就能够解决这个问题。
2) 乱码的解决。
[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
设置服务器的字符串编码

//设置服务器输出的编码为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 = response.getWriter();

// 往 客户 端 输出数据。

// writer.write("this is response content!");



// 输出中文数据到客户端

 writer.write("这是中文的输出");

}再次经过浏览器访问。获得的是正确的中文。 图5:

相关文章
相关标签/搜索