request.setCharacterEncoding("UTF-8")失效问题

本文介绍了在JSP页面中如何正确使用request.setCharacterEncoding方法来转换请求参数的字符编码为UTF-8,确保中文等非ASCII字符能被正确读取。文章通过示例代码展示了该方法必须位于getParameter调用之前才能生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

request.setCharacterEncoding("UTF-8");

 

在服务器端,要转变请求的字符串编码,用request.setCharacterEncoding("UTF-8");这个方法要放在jsp代码的request.getParameter()方法前面。如

<%@page contentType="text/html" pageEncoding="GBK" session="false"
%><%
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		System.out.println("userName;--->" + username);
		response.setCharacterEncoding("UTF-8");
		System.out.println("---------------------------------------");
		username = request.getParameter("username");
		System.out.println("after request set encoding userName;--->" + username);
		

		}

		%>

 如果不是getParameter()前面,比如放在

String username = request.getParameter("username");
		System.out.println("userName;--->" + username);

 

后面的话,request.setCharacterEncoding("UTF-8");这句转码等于没转,具体原因还没研究清楚。不过,可以放在String queryString = request.getQueryString()的后面,比如:

<%@ page contentType="text/html;charset=GBK"  %><%
String queryString = request.getQueryString();
String reqEnc = getQueryValue(queryString,"req_enc=");
if(reqEnc!=null){
    request.setCharacterEncoding(reqEnc);
}
String respEnc = getQueryValue(queryString,"resp_enc=");
if(respEnc!=null){
    //out.println(respEnc);
    response.setCharacterEncoding(respEnc);
}
%><%!String getQueryValue(String queryString,String key){
    if(queryString==null || queryString.length()==0)return null;
    int reqIdx = queryString.indexOf(key);//req_enc=utf-8&resp_enc=gbk
    String enc = null;
    if(reqIdx!=-1){
        reqIdx = reqIdx+key.length();
        int endIdx = reqIdx;
        for (;
        endIdx < queryString.length() && queryString.charAt(endIdx)!='&';
        endIdx++) {
        }
        if(endIdx>reqIdx){
            enc = queryString.substring(reqIdx,endIdx);
            if(!enc.equalsIgnoreCase("gbk")
                    && !enc.equalsIgnoreCase("utf-8")){
                enc = null;
            }else{
                System.err.println("error :"+key+" is "+ enc);
            }
        }
    }
    return enc;
}%>

 

request.setCharacterEncoding(reqEnc);就是要放在request.getParamter()方法前面才会生效。

 

 

``` package com.example.lab4; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @WebServlet(name = "Servlet2", value = "/Servlet2") public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8");// 补齐,设置request的字符集编码 String username=request.getParameter("username");//获取参数username的结果赋值给username String password=request.getParameter("password"); InputStream is = request.getInputStream(); byte buff[] = new byte[1024]; StringBuilder sb = new StringBuilder(); int len = 0; while ((len = is.read(buff))!=-1){ sb.append(new String(buff,0,len)); } response.getWriter().println(sb.toString()); //__________________________ //获取参数hobby的结果赋值给hobbys // String hobStr=""; // for(int i=0;i<hobbys.length;i++){ // hobStr=hobStr+hobbys[i]+","; // } // response.getWriter().println("用户名是:"+username+ // ",密码是:"+password+",爱好是:"+hobStr); } } <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/lab4_war_exploded/Servlet2" method="post"> 用户名:<input type="text" name="username"> </br> 密码:<input type="password" name="password"> </br> <input type="submit" value="提交"> </form> </body> </html>```HttpServletRequest对象的getInputStream()和getReader()方法,输出用户名和密码后,能够获取到用户名和密码,并显示出来。但是上面的代码无法正确的显示出文本框和按钮
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值