zoukankan      html  css  js  c++  java
  • 中文乱码问题的解决途径

    1 在IDE工具中查看源文件时显示中文乱码

    解决途径:

    使用记事本打开源文件,并另存为,选择编码方式为UTF-8后,保存,替换当前文件。

    2 从数据库中查询的字段信息包含中文时返回的查询信息显示乱码

    解决途径:

    在sql语句执行之前添加请求编码设置:request.setCharacterEncoding("UTF-8");

    Class.forName(DBDRIVER) ;
    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
    String sql = "SELECT name FROM user WHERE id=? AND password=?" ;
    pstmt = conn.prepareStatement(sql) ;
    pstmt.setString(1,request.getParameter("id")) ;
    pstmt.setString(2,request.getParameter("password")) ;
    request.setCharacterEncoding("UTF-8");
    rs = pstmt.executeQuery() ;	// 查询
    

      以上方法亦可应用于向数据库插入数据的情形。但是,在Java Bean中却只能采用以下方法:

      String url = "jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8"; //加上这部分有关编码设置的代码

    3 在表单提交后,接收页面显示提交的表单参数显示为中文乱码

    之所以会产生乱码,常常是因为服务器和客户端沟通的编码不一致造成的。这里针对所遇到的两种常见的典型问题进行分析。

    (1) 表单以GET方式提交

     |- 解决案例:

    <%
        String info = request.getParameter("info");//接收数据
        //获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
        String content =new String(info.getBytes("ISO8859-1"), "UTF-8") ;
    %>
    <h2><%=content%></h2>
    

     |- 分析过程:

      如果提交方式为get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据。因此,只能在接收到数据后再手工转换。

     a) 获取获取客户端提交上来的数据,得到的是乱码字符串,data="???è?????"

       String data = request.getParameter("paramName");

     b) 查找ISO8859-1码表,得到客户机提交的原始数据的字节数组

       byte[] source = data.getBytes("ISO8859-1");

       c) 通过字节数组以指定的编码构建字符串,解决乱码

       data = new String(source, "UTF-8");

      通过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端提交数据时使用的字符编码来定的。如果是GB2312,那么就设置成data = new String(source, "GB2312");如果是UTF-8,那么就设置成data = new String(source, "UTF-8") 。

    此外,除了表单形式外,通过URL地址重写方式也可以实现数据的GET方式提交,其格式通常为:

    动态页面地址?paramname1=param1&paramname2=param2&...,如:

    request_demo03.jsp?name=zhangsan&password=123456

    (2) 表单以POST方式提交

    |- 解决案例:

    <%
        response.setContentType("text/html;charset=utf-8");//设置客户端的编码显示格式
        request.setCharacterEncoding("UTF-8") ;// 设置的是统一编码
        String content = request.getParameter("info") ;
    %>
    <h2><%=content%></h2>
    

    |- 分析过程:

    如果提交方式为post,只需在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收。如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding("UTF-8")) 。此外,在此基础上,如果仍然有乱码,则需要另外添加设置:response.setContentType("text/html;charset=utf-8"); ,这个至于为何会如此,我的看法是 这是为了让 客户端的编码显示格式 与服务端的接收设置编码格式 保持一致的直接途径。


    (3) 总结

    request.setCharacterEncoding()方法的含义是:接收request请求中的数据,并把接收的数据当做指定的编码方式来看待(识别)。所以在发送方,发起request请求的页面,源头设置数据的编码方式很重要,对于get请求,默认设置编码方式是ISO8859-1,对于post请求,就不得而知了,这要视具体情形而定。但如果源头设置页面的编码方式为utf-8(<%@ page contentType="text/htm;charsetutf-8"%>),则接收request请求的时候会比较容易,因为信息很明确了。此外,通过过滤器(request.setCharacterEncoding())可以统一设置编码方式。


    get与post方式的差异

    主要体现出两点差异:

    a) 使用get提交时,提交的内容会显示在地址栏之后,而使用post提交,提交的内容是不会显示在地址栏上的。

    使用get提交时所有输入的内容都将自动在地址栏之后显示,这一点与地址重写的格式是一样的。而post本身没有任何的内容显示,只是将提交后的目标地址显示出来。因此,直接输入地址访问页面本身就属于get提交方式,而post只是应用在表单上的操作。

    b) 表单提交的数据大小差别很大

    get请求由于需要在地址栏上显示信息,所以信息的长度有所限制,一般大小是4~5KB的数据;而post因为不会显示,可以提交更多内容。如果表单中有一些大文本或者一些图片数据,或者有涉及到密码等安全信息时,则只能使用post的方式提交。

  • 相关阅读:
    Myeclipse运行报错:an out of memory error has occurred的解决方法
    关于UnsupportedClassVersionError的错误处理
    Java设置session超时(失效)的三种方式
    mybatis自增长插入id
    揭开Java IO流中的flush()的神秘面纱
    mybatis多表查询
    在Myeclipse中提交代码到GitHub中
    一台电脑安装多个版本的jdk
    使用Git的Push出现rejected
    暴力解决HTMLTestRunner出现dict() ->new empty dictionary的问题
  • 原文地址:https://www.cnblogs.com/ioveNature/p/6813679.html
Copyright © 2011-2022 走看看