您的位置:首页 > 编程语言 > Java开发

关于程序中乱码解决方案下:乱码解决篇

2016-08-27 13:07 267 查看
乱码的种类有三种
         * 数据存储之后的乱码
         * 数据展示过程中的乱码
         * 数据传递过程中的乱码
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>

第三种解决方案:专门解决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.

希望对你有帮助,祝你有一个好心情,加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乱码 解决方案 java
相关文章推荐