zoukankan      html  css  js  c++  java
  • 【转】JavaWeb编码之get方式中文乱码问题

    一、现象描述

    以get方式提交含中文表单,后台接收为乱码:

    <form action="admin/User/searchUser.do" method="get">
        <div class="input-group">
           <input type="text" class="form-control" name="content" value="${content}" placeholder="Search for..." required>
           <span class="input-group-btn">
               <button class="btn btn-default" type="submit">搜索</button>
           </span>
       </div>
    </form>

    访问地址为: 
    地址 
    后台输出为: 
    输出

    二、现象分析

    URL 的组成部分如下: 
    URL组成

    请求的地址为: 
    请求地址

    从Request URL 可以看出 QueryString 编码是GBK。

    以 GET 方式 HTTP 请求的 QueryString 和以 POST 方式 HTTP 请求的表单参数都是作为 Parameters 保存的,都通过 request.getParameter 获取参数值。

    对它们的解码是在 request.getParameter 第一次被调用时进行的。 
    request.getParameter 方法被调用时将会调用 org.apache.catalina.connector.Request 的 parseParameters 方法。这个方法会对 GET 和 POST 方式传递的参数进行解码,但是他们解码的字符集可能不一样。

    而QueryString编码采取的字符集要么是 Header 中 ContentType 定义的Charset,要么是默认的 ISO-8859-1 编码。

    而此处 html 页面未设置 Content-Type,由此得出结论:中文经过GBK编码后,在服务端经过 ISO-8859-1解码,导致乱码。

    三、解决方式

    1. 配置Tomcat的 server.xml 文件中的 connector 的 URIEncoding 和 useBodyEncodingForURI 属性(useBodyEncodingForURI = “true” 表示使用 ContentType 定义的编码,而且此处的 URI 仅仅是对 QueryString 使用 BodyEncoding 解码);
    2. 使用 new String(str.getBytes(“ISO-8859-1”), “UTF-8”) 解码;

    验证如下: 
    方式1: 
    配置

    结果为: 
    结果

    使用 UTF-8 解码则中文正确传递。

    方式2:

    @RequestMapping(value = "/searchUser")
    public String searchUser(String content) {
        System.out.println("content: " + content);
        try {
            content = new String(content.getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println("content after decode: " + content);
    }

    结果为: 
    结果

  • 相关阅读:
    论信息系统项目的范围管理
    Windows服务/Linux守护创建及安装
    C#开源网络通信库PESocketde的使用
    Unity本地持久化类PlayerPrefs使用详解
    记录一个闪烁,跳动,光圈的动画
    一、Linux驱动学习-了解系统
    用c#自己实现一个简单的JSON解析器
    highcharts的yAxis标题过长 分行显示
    Mysql binlog恢复数据
    Xamarin.Forms实例旅行日志
  • 原文地址:https://www.cnblogs.com/julinhuitianxia/p/7679956.html
Copyright © 2011-2022 走看看