乱码的种类有三种
* 数据存储之后的乱码
* 数据展示过程中的乱码
* 数据传递过程中的乱码
6、关于数据存储过程中的乱码:
* 数据存储之后的乱码: 数据最终保存到数据库表中的时候,表中的数据有乱码现象。
* 怎么解决这个问题呢?
- 先查看在执行insert语句之前是否是乱码,如果是乱码,先解决保存之前的乱码问题。
- 执行insert语句之前不是乱码,保存之后出现乱码,那可能是数据库表本身不支持简体中文。
7、数据展示过程中的乱码?
* 服务器端的程序响应中文到浏览器,出现乱码:
response.setContentType("text/html;charset=UTF-8"); 为什么编写UTF-8呢?
out.print("中文");
工作区的编码方式采用UTF-8,说明这里的“中文”这两个字也是采用UTF-8的编码方式,
这时采用charset=UTF-8的方式响应到浏览器上,不会出现乱码。
工作区的编码方式采用GBK,说明这里的“中文”这两个字也是采用GBK的编码方式,
应该编写这样的代码不会出现中文乱码:
response.setContentType("text/html;charset=GBK");
* 在myeclipse中编写html文件,假设工作区现在使用的是UTF-8的编码方式,并且在html文件中并没有编写:<meta charset="UTF-8">
此时,浏览器访问该html页面的时候,中文出现乱码,因为浏览器在简体中文的操作系统当中,浏览器默认采用GBK的方式展示HTML页面。怎么解决这个问题,包括两种
方式:
第一种方式:将工作区的字符编码方式设置为GBK
第二种方式:在HTML文件当中添加:<meta charset="UTF-8">
8、数据传递过程中的乱码?
* 数据传递过程中的乱码:浏览器上的表单中的数据提交给服务器之后,在服务器端获取表单中数据的时候出现中文乱码问题。
Browser --(传递过程中出现乱码)-> Server
* 为什么浏览器向web服务器提交中文的时候,在服务器端获取到的中文是乱码呢?
- 浏览器向服务器提交中文的时候,中文是不能直接在网络中传送的。首先被ISO-8859-1进行编码,在网络中传送的是一串经过ISO-8859-1编码之后的数据,传送给服务器端之后,服务器将这一段ISO-8859-1编码的数据拿到,但是不知道该这段数据编码之前是哪个国家的文字,所以无法正常显示数据。
怎么解决这个数据传递过程中的乱码问题?
第一种解决方案:万能解决方案
假设现在在浏览器上使用的编码方式是UTF-8,在表单中编写了“张三”汉字,此时的“张三”汉字是采用UTF-8的编码方式。
提交表单会先将UTF-8编码方式的“张三”转换成ISO-8859-1编码方式的“张三”
传送给服务器,服务器接收到之后,先经过"ISO-8859-1"的编码方式进行“解码”还原,
还原之后再通过UTF-8的编码方式进行重新编码。
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1"); //解码
username = new String(bytes,"UTF-8"); //编码
UTF-8 --> ISO-8859-1 --> UTF-8
以上的UTF-8是可变的,以浏览器上使用的编码方式为准。
第二种解决方案:专门解决POST请求的中文乱码
* 无框架下编写
request.setCharacterEncoding(????);
??? 这个位置写什么:写浏览器的编码方式。
另外以上的代码只对请求体进行编码,不对请求行中的数据编码,所以不能解决GET请求的乱码问题。
另外以上代码必须在从request对象中获取数据之前设置有效。
* 框架下编写
在WEB-INF文件下配置过滤器
<!-- 表单提交POST中文乱码解决方案统一字符编码为UTF-8 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)</span>
下面有三篇文章用于理解上面配置:(tomcat8之后tomcat会自动解决get中文乱码)
详解Spring中的CharacterEncodingFilter
第三种解决方案:专门解决GET请求的中文乱码
修改CATALINA_HOME/conf/server.xml文件:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
maxThreads="200"/>
注意:这里的编码方式UTF-8也不能随意编写,需要和浏览器的编码方式一致。
另外:Connector标签中可以配置什么信息呢?
* 端口号 URI字符编码方式 线程数量 .....
一个web站点的默认端口号是:80端口,80端口在一个url中可以不写,默认就是80
以上的编写参考文档:CATALINA_HOME/webapps/docs/config/http.html(我的:E:/tomcat7/webapps/docs/config/http.html)
Tomcat服务器底层在实现的时候,默认情况下可支持同时200个线程并发,WEB服务器底层为了提高程序的执行效率,一般都提供了线程池技术(Thread Pool)。用户在访问的时候,实际上不会new线程,实际上是在服务器启动阶段就提前将线程new好了,放到线程池当中。
<pre name="code" class="html">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 DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//不能解决get请求乱码
//request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
//万能解决方案,适应GET和POST请求。但是这种解决方案编写代码太多。比较麻烦。
//获取用户名
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1");
username = new String(bytes,"UTF-8");
System.out.println(username);
*/
//有效
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
//无效
//request.setCharacterEncoding("UTF-8");
System.out.println(username);
}
}
图1 CATALINA_HOME/webapps/docs/config/http.html页面
9、怎么保证不出现乱码?
只能说是尽量避免出现乱码,在项目开发过程中统一采用统一编码方式,凡是涉及到编码方式的统一都用UTF-8.
希望对你有帮助,祝你有一个好心情,加油!