后台接收数据时中文乱码问题

  • post方式提交中文数据乱码产生的原因和解决办法

  • 由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。修改后的代码如下:
  • public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             * 客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
             */
            request.setCharacterEncoding("UTF-8");
            String userName = request.getParameter("userName");
            System.out.println("userName:"+userName);
    }

  • get方式提交中文数据乱码产生的原因和解决办法

对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         *
         * 对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据
         */
        String name = request.getParameter("name");//接收数据
        name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组然后通过字节数组以指定的编码构建字符串,解决乱码问题
        System.out.println("name:"+name);    
}

以超链接形式传递中文参数的乱码问题

客户端想传输数据到服务器,可以通过表单提交的形式,也可以通过超链接后面加参数的形式,例如:

<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=徐达沛">点击</a>
点击超链接,数据是以get的方式传输到服务器的,所以接收中文数据时也会产生中文乱码问题,而解决中文乱码问题的方式与上述的以get方式提交表单中文数据乱码处理问题的方式一致,如下所示:

 String name = request.getParameter("name");
 name =new String(name.getBytes("ISO8859-1"), "UTF-8");

另外,需要提的一点就是 URL地址后面如果跟了中文数据,那么中文参数最好使用URL编码进行处理,如下所示:

<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("徐达沛", "UTF-8")%>">点击</a>
 
 

Tomcat服务器的设置

(此方法与前面写的方法不兼容,一般Tomcat设置UTF-8编码后,后台无需进行编码转换)


在server.xml中修改 
 <Connector  connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
 <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>


总结



1、如果提交方式为 post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收( request.setCharacterEncoding("UTF-8"))

2、如果提交方式为 get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据,因此要想不乱码,只能在接收到数据后再手工转换,步骤如下:

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

String data = request.getParameter("paramName");
        2).查找ISO8859-1码表,得到客户机提交的原始数据的字节数组
 byte[] source = data.getBytes("ISO8859-1");
       3).通过字节数组以指定的编码构建字符串,解决乱码

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

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







  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现中文乱码的原因可能是因为在表单提交,使用了不同的字符编码方式。常见的字符编码方式有UTF-8、GBK等。为了解决中文乱码问题,可以尝试以下几种方法: 1. 在表单中添加一个隐藏的input,用于设置字符编码方式: ``` <form method="post" action="submit.php"> <input type="hidden" name="charset" value="utf-8"> ... </form> ``` 在后台接收数据,可以先获取该input的值,然后使用对应的字符编码方式解码数据。 2. 在后台接收数据,手动指定字符编码方式: ``` String param = new String(request.getParameter("param").getBytes("iso-8859-1"), "utf-8"); ``` 这里假设前端使用的是UTF-8编码方式,后台使用的是iso-8859-1编码方式。首先将iso-8859-1编码的数据转换为字节数组,然后再使用utf-8编码方式将其转换为字符串。 3. 在web.xml中配置字符编码过滤器: ``` <filter> <filter-name>encodingFilter</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>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这里使用了Spring框架提供的字符编码过滤器,可以自动将所有请求的字符编码方式设置为UTF-8

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值