zoukankan      html  css  js  c++  java
  • Web 项目遇到的乱码问题

    问题代码:

      jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
      </head>
    <body>
    
        <!-- 提交的时候必须是name=value键值对 -->
        
        <!-- 应用名+请求路径 -->
        <form action="/gp_web_day17/RequestDemo5" method="get">
            用户名:<input type="text" name="username"><br/>
            密    码:<input type="password" name="pwd"><br/>
            性    别:<input type="radio" name="sex" value="男" /><input type="radio" name="sex" value="女" />女<br />
                   
            爱    好:<input type="checkbox" name="hobby" value="睡觉">睡觉           
                   <input type="checkbox" name="hobby" value="游戏">游戏    
                   <input type="checkbox" name="hobby" value="旅游">旅游<br />
            
            所在国家:<select name="sel">
                        <option>-----请选择-----</option>
                        <option value="cn">中国</option>
                        <option value="fa">法国</option>
                        <option value="en">英国</option>
                    </select>
                    
            <input type="submit" value="注册">
        </form>
    </body>
    </html>

       Servlet:

    @WebServlet("/RequestDemo5")
    public class RequestDemo5 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        public RequestDemo5() {
            super();
            
        }
    
        //处理get方式的乱码问题:
        //     get方式传递的参数内容默认编码方式问ISO-8859-1
        
        //    1 自己用再编码再解码处理
        //    2在tomcat的配置文件中加入URIEncoding="UTF-8"
        public String dispose(String str){
            
            try {
                
           //编码
    byte[] arr = str.getBytes("ISO-8859-1");   //解码 String ssString = new String(arr, "UTF-8"); return ssString; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("解码前:"+request.getParameter("username")+" "+request.getParameter("sex")); String name = dispose(request.getParameter("username")); String sex = dispose(request.getParameter("sex")); System.out.println("解码后:"+name+" sex:"+sex); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }

    运行结果:

    问题分析:

    问题解决:

    //告诉浏览器使用ISO-8859-1编码方式,就可以检测get方法再编码再解码方式是否可以解决乱码问题

    <meta http-equiv="Content-Type" content="text/html; charset="ISO-8859-1">

    问题总结:

    <!-- contentType="text/html; charset=UTF-8:  
            jsp在编辑器中保存文件,使用的是UTF-8编码格式
            问题:通过浏览器调用servlet文件,出现中文乱码
    -->
    
    <!-- pageEncoding="UTF-8:  
            jsp在编辑器中保存文件,使用的是UTF-8编码格式 
            问题:通过浏览器调用jsp,jsp出现中文乱码
    -->
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <!-- 通过<meta>标签模拟response头,控制浏览器用ISO-8859-1的编码解析 --> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


    //处理get方式的乱码问题:
      // get方式传递的参数内容默认编码方式ISO-8859-1

      // 1 自己用再编码再解码处理
      // 2在tomcat的配置文件中加入URIEncoding="UTF-8"

    //处理post方法解决乱码问题:

    //将response对象中的数据以UTF-8解码后的字节发送给浏览器
      // request.setCharacterEncoding("utf-8");

    UTF-8国际编码  GBK中文编码(包含GB2312,即通过GB2312编码后可以通过GBK解码,反之不成立)

    tomcat8以后默认编码格式是utf-8;7之前的都是iso8859-1

      如果默认情况下,tomcat使用的的编码方式:iso8859-1

      修改tomcat下的conf/server.xml文件

      找到如下代码:    
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
      这段代码规定了Tomcat监听HTTP请求的端口号等信息。

      可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

      修改完成后:

        <Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

    getBytes()通过平台默认字符集进行编码

    get方式传递的参数内容默认编码方式ISO-8859-1

    ?? 表示没有编码

    String编码和URLEncoder.encode编码方式的区别:

      new String(bytes[], "utf-8"):新建了一个utf-8编码的字符串

      URLEncoder.encode("", "utf-8"):不只是按照utf-8生成了一个字符串,还将其中不安全字符做了处理

    看到tomcat8.0之后默认是UTF-8编码,打算测试一下,使用response的输出流对象,将“你好”写入到浏览器端,此时出现了一个新的问题:

    预计结果:

      tomcat使用UTF-8编码,通过response.setContentType()告知浏览器使用UTF-8解码,而“你好”.getBytes()使用平台默认编码,即UTF-8,二者输出结果应该一致

      浏览器输出  “你好 你好”

    出现问题:

      浏览器输出  “���你好”

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            ServletOutputStream soServletOutputStream = response.getOutputStream();
            
            //解决:设置服务器端使用的编码 同时告知浏览器是用什么编码 
            response.setContentType("text/html;charset=UTF-8");
            
            //getBytes() 
            //使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
            //getBytes( charset )使用给定的 charset
            //将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
            soServletOutputStream.write("你好".getBytes());
            soServletOutputStream.write("你好".getBytes("UTF-8"));
            
            soServletOutputStream.close();
        }

    问题分析:

      “你好”.getBytes("UTF-8")正常输出,说明tomcat8.5默认编码为UTF-8,浏览器使用UTF-8进行解码,输出正常不乱码

      “你好”.getByte()输出乱码,说明编码格式不是UTF-8,查看文档“适用平台默认字符集编码”,而平台为Eclipse(默认编码为GBK),浏览器使用UTF-8解码,输出乱码

    问题解决:

      为了测试是否是默认平台编码的问题,通知浏览器使用GBK编码,输出  “你好浣犲ソ”,那么说明问题原因正确

    response.setContentType("text/html;charset=GBK");

      

    问题描述:

      出现“UnsupportedEncodingException”异常

    问题分析:

      查看文档“不支持问题编码”,说明一定是getBytes(charset)参数有问题

    outputStream.write("你好".getBytes(""));

    问题解决:

    outputStream.write("你好".getBytes());

     参考博客:http://www.cnblogs.com/oldinaction/p/5167481.html

      

  • 相关阅读:
    Android通讯录查询篇ContactsContract.Data
    startActivityForResult 用法
    Android 开发 – 使用菜单
    屏幕旋转 转
    动态更改屏幕方向LANDSCAPE与PORTRAIT 转
    .使用ContactsContract API
    主题:android之XmlResourceParser类使用实例 转
    Android使用AttributeSet自定义控件的方法 转
    EmbossMaskFilter BlurMaskFilter
    字典转换成实体列表
  • 原文地址:https://www.cnblogs.com/roxy/p/7460685.html
Copyright © 2011-2022 走看看