zoukankan      html  css  js  c++  java
  • get/post时中文乱码问题的解决办法(转载)

    1、文章1

    最近遇到一个问题:用get方法传递中文有问题,用post没有问题。
    问题简单的描述是这样的: <a href="userGroup.jsp?userGroupName=<%=userGroupName%>">aa</a>
    这里userGroupName是中文
    在userGroup.jsp页面得到的userGroupName却是乱码。
    每个页面也都有<%@ page language="java" pageEncoding="GBK" %>说明。
    后来上网找了一下才知道:pageEncoding这个只对post起作用。get方法提交时,大家可以从地址栏里看到提交的参数,这是因为get方法传递是作为报文头提交的,而pageEncoding对报文头是没有作用的,所以仍然按照 iso8859-1编码,才出现了刚才的乱码问题。而post提交的是form表单的内容,pageEncoding指定了它的编码,所以他会按照指定编码传递。
    问题清楚了,下面就来解决它:
    由于tomcat的servlet实现中ServletRequest.setCharacterEncoding方法未对HTP报文头的内容进行解码,因此
    使用HTTP的GET方法提交的数据将不能正确的解码.解决方案为修改其服务器的配置server.xml文件中对HTTP协议的
    Connector配置,加上URIEncoding="GBK"属性,配置完成以后"可能"的内容为
    < Connector port="8080"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    debug="0" connectionTimeout="20000" 
    disableUploadTimeout="true" URIEncoding="GBK" /> 
    大功告成!

    2、文章2

    表单提交中,method="GET" 为默认值,通过url提交过去,形式为:http://localhost:8081/test.jsp?username=bebe0453&password=082628&submit=%C8%B7%EF%BF%BD%EF%BF%BD

    而 method="POST" ,则为隐式提交,在浏览器地址栏不会出现参数。

    POST更加保密,且提交过去的容量更大,一般都采用POST提交。

    3、文章3

    在项目中,我们经常遇到需要在jsp页面切换中传递中文字符。这主要有两种方式。

    1. URL方式,例如:http://website/test1.jsp?act=add&type=苹果&param=%20D%20B 
    2. FORM方式,例如: 

                         <form name=test  mehtod="post">

                                  <input type=hidden name=text2 value="中文">

                                 <input type=text name=text1>

                                 <input type=submit value=submit>

                        </form>

        我们将针对这两种情况,分别提供中文正确传递的解决方法。

    情况1:URL方式

    例如:http://website/test1.jsp?act=add&type=苹果&param=%20D%20B

    • 一般来说我们很少直接在URL里面把参数写成中文,如例子中的"type=苹果"这样传递。如果出现这种情况,在我们的接收参数的页面我们只需要做个简单的转换就可以了。 

                代码test1.jsp:(主要部分)

               <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

           <%

               String type = request.getParameter("type");

               String result = new String(type.getBytes("iso-8859-1"), "gb2312");     

               out.println(result);  

         %>

    • 更普遍的做法,就是对url中的中文字符进行编码,变成类似type=%20D%20B这样的字符。 

    代码MyJsp1.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ page import="java.net.*" %>

    <a href='./MyJsp2.jsp?act=<%=URLEncoder.encode("中国人 非常好 =-")%>'>test</a>

    代码MyJsp2.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ page import="java.net.*" %>

    String tempVal = URLDecoder.decode(request.getParameter("act")); out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));

         情况2:FORM方式

         请注意,我们只是讨论在<form enctype="application/x-www-form-urlencoded" >这种形式的中文情况,因为在enctype="multipart/form-data"的时候通过解析出来中文也可以运用这种方法进行字符转 化,所以不再重复讨论。

    • <form method=post>这种情况最简单。 

    代码MyJsp1.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    <form action="./MyJsp2.jsp" method="post" enctype="application/x-www-form-urlencoded" > <input type=hidden name=act value=动作 /> <input type=submit value=ok> </form>

    代码MyJsp2.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    request.setCharacterEncoding("gb2312");

    out.println(request.getParameter("act"));

    或者

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    String tempVal = request.getParameter("act");

    out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));

    • <form method=get>情况。 

    代码MyJsp1.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    <form action="./MyJsp2.jsp" method="get" enctype="application/x-www-form-urlencoded" > <input type=hidden name=act value=动作 /> <input type=submit value=ok> </form>

    代码MyJsp2.jsp:

              

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

    String tempVal = request.getParameter("act");

    out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/jianmang/p/4451042.html
Copyright © 2011-2022 走看看