`

sendRedirect的URL请求中文乱码问题

阅读更多

        在项目中有另外一系统请求我们的系统,我们会根据请求传入的入参数再进一步获取其它的参数,然后才sendRedirect到真正的请求上。在测试时发现,如果获取的其它参数中有中文汉字,再sendRedirect时出错,原因是地址栏上的中文汉字变成了乱码。

        在网上看到说通过URLDecoder.decode(request.getParameter("param1"))即可,但由于我这里的参数比较多,且有些参数还是JSON格式的,不能简单的对URL进行URLDecoder.decode处理(因为整个请求中的:、{、}、//都会被编码),正确的做法是只对URL中的中文进行URLDecoder.decode处理。我的处理方法及测试如下:

import java.io.UnsupportedEncodingException;

public class Main {

    public static void main(String[] args) {
        String str = "欢迎光临我的博客iteye,网址http://bijian1013.iteye.com/";
        String resStr = getEncodeStr(str);
        System.out.println(resStr);
    }

    private static String getEncodeStr(String str) {
        StringBuffer resultStrBuf = new StringBuffer();
        StringBuffer chineseStrBuf = new StringBuffer();
        try {
            for (int i = 0; i < str.length(); i++) {
                if ((str.charAt(i) + "").getBytes().length > 1) {
                    chineseStrBuf.append(str.charAt(i));
                } else {
                    if (chineseStrBuf.length() > 0) {
                        resultStrBuf.append(java.net.URLEncoder.encode(chineseStrBuf.toString(), "UTF-8"));
                        chineseStrBuf.delete(0, chineseStrBuf.length());
                    }
                    resultStrBuf.append(str.charAt(i));
                }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return resultStrBuf.toString();
    }
}

运行结果:

%E6%AC%A2%E8%BF%8E%E5%85%89%E4%B8%B4%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2iteye,%E7%BD%91%E5%9D%80http://bijian1013.iteye.com/

 

附一:Java如何从字符串中取出中文、Java如何从字符串中取出中文和数字,去掉其他字符

public class Main {

    public static void main(String[] args) {
        
      //Java如何从字符串中取出中文
      System.out.println("深圳2015SH".replaceAll("[\\p{ASCII}]",""));
      System.out.println("深圳2015SH".replaceAll("[\\x00-\\x7F]",""));
      
      //Java如何从字符串中取出中文
      String str = "欢迎光临我的博客iteye,网址http://bijian1013.iteye.com/";
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < str.length(); i++) {
          if ((str.charAt(i)+"").getBytes().length>1) {
              sb.append(str.charAt(i));
          }
      }
      System.out.println(sb);
      
      //Java如何从字符串中取出中文
      System.out.println("欢迎光临我的博客iteye,网址http://bijian1013.iteye.com/".replaceAll("[^\\u4E00-\\u9FA5]", ""));
      System.out.println("欢迎光临我的博客iteye,网址http://bijian1013.iteye.com/".replaceAll("[\\w]", "").replaceAll("\\p{Punct}", ""));
      
      //Java如何从字符串中取出中文和数字,去掉其他字符
      String str1 = "^2^3da42b3中文sae34科e技b2字符2`~!@#$%^&*()_+-=[]{};':\",.<>/?\\93啊";
      str1 = str1.replaceAll("[^0-9\\u4e00-\\u9fa5]", "");
      System.out.println(str1);
    }
}

运行结果:

深圳
深圳
欢迎光临我的博客,网址
欢迎光临我的博客网址
欢迎光临我的博客,网址
23423中文34科技2字符293啊

 

附二:检查输入的字符串中是否包含中文

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 检查输入的字符串中是否包含中文
 */
public class Main {
    
    static String regEx = "[\u4e00-\u9fa5]";
    static Pattern pat = Pattern.compile(regEx);
    
    public static void main(String[] args) {
        String input = "Hell world!";
        System.out.println(isContainsChinese(input));//false
        input = "hello world";
        System.out.println(isContainsChinese(input));//false
        input = ",http://bijian1013.iteye.com/";
        System.out.println(isContainsChinese(input));//false
        input = ",http://bijian1013.iteye.com/";
        System.out.println(isContainsChinese(input));//false
        input = "[]%http://bijian1013.iteye.com/";
        System.out.println(isContainsChinese(input));//false
        input = "【】%http://bijian1013.iteye.com/";
        System.out.println(isContainsChinese(input));//false
        input = "中国http://bijian1013.iteye.com/";
        System.out.println(isContainsChinese(input));//true
    }
    
    public static boolean isContainsChinese(String str) {
        Matcher matcher = pat.matcher(str);
        boolean flg = false;
        if (matcher.find()) {
            flg = true;
        }
        return flg;
    }
}

运行结果:

false
false
false
false
false
false
true
分享到:
评论

相关推荐

    解决tomcat中文乱码问题

    当使用`sendRedirect`重定向时,URL中的参数可能因编码问题导致中文乱码。有两种常见处理方法: 1. **编码转换**:将中文字符串先转换为ISO-8859-1编码,然后再附加到URL上。 2. **URL编码**:使用`java.net....

    servlet的程序编写的乱码处理

    当使用`sendRedirect()`进行重定向时,如果URL中包含中文字符,也会出现乱码问题。 解决方法是使用`URLEncoder.encode()`对中文进行编码处理。 ```java protected void doGet(HttpServletRequest request, ...

    java乱码的解决方案

    在Java开发过程中,字符编码问题常常导致中文显示为乱码。乱码问题可能出现在各种场景下,例如JSP页面、Servlet处理请求等。本篇文章将详细探讨Java乱码问题产生的原因及解决方案。 #### 一、问题背景与原因分析 ...

    解决中文乱码的几种解决方法(推荐)

    解决中文乱码的问题是中文用户在使用计算机系统、网络以及各种编程语言中经常遇到的麻烦。由于中文字符集的特殊性,如果在数据传输或存储过程中处理不当,就会出现乱码问题。中文乱码主要发生在数据编码和解码的过程...

    javaweb乱码

    对于GET请求方式,由于参数直接包含在URL中,因此可能会出现乱码问题。为了解决这一问题,可以在转发或重定向前对参数进行编码。 1. **参数编码**:使用`URLEncoder.encode()`方法对参数进行编码。 ```java ...

    jsp和servlet请求与响应

    本文详细介绍了JSP和Servlet中关于请求与响应的关键知识点,包括JSP内置对象的作用、请求与响应对象的使用方法、中文乱码问题及其解决办法、转发与重定向的区别以及Servlet的基本创建和配置流程。希望这些内容能够...

    JavaWeb个人学习笔记

    - 在GET请求中,中文数据会直接附加在URL之后,由于URL是基于ASCII字符集,直接发送中文会导致乱码。为了解决这个问题,需要在服务器端使用正确的方法解码URL字符串。 - 在POST请求中,如果请求头和表单编码设置不...

    第20章 Request和Response.pdf

    - `setCharacterEncoding(String encoding)`:设置请求体的字符编码,防止中文乱码。 二、Response对象 `Response`对象代表HTTP响应报文,用于向客户端发送响应。其主要功能包括: 1. **设置响应消息**: - `...

    servlet配置.docx

    在 Servlet 中,需要处理请求和响应的乱码问题。可以使用 req.setCharacterEncoding("utf-8") 处理请求的乱码,使用 resp.setContentType("text/html;charset=utf-8") 处理响应的乱码。 五、web 项目的引入 jar ...

    基于HttpServletRequest 相关常用方法的应用

    - `request.setCharacterEncoding("UTF-8")`:用于设置请求体(POST方式)的数据编码,防止中文乱码。但需要注意的是,此方法只能对POST方式的请求生效,GET方式的请求编码通常在服务器配置或者过滤器中统一处理。 ...

    servlet初级基础知识入门笔记

    - 解决乱码问题:通过设置请求的字符集,例如`request.setCharacterEncoding("utf-8")`。 - 处理请求资源路径:容器根据URL找到对应的Servlet配置,并调用相应的Servlet实例。 7. **处理多种请求** - 可通过修改...

    jsp课后习题第4章.docx

    重定向网页通常使用`sendRedirect()`方法,如`response.sendRedirect("location")`,其中`location`是重定向的目标URL。 关于session对象的生命周期,如果用户长时间不进行任何操作,一旦超过了JSP容器配置的...

    Servlet生命周期,http

    关于乱码问题,Servlet处理中文字符时可能会遇到编码问题。在请求和响应过程中,确保正确的字符编码至关重要。例如,可以使用`request.setCharacterEncoding("UTF-8")`来设置请求的编码,通过`response....

    java/jsp面试红宝书

    - URL包含中文参数,需在JSP页面中设置请求编码。 7. **Cookie与Session的区别**: - Cookie存储在客户端,Session存储在服务器端。 - Cookie有生命周期限制,Session无默认生命周期,依赖于浏览器会话或显式...

    jsp编程中的小技巧(仅供参考)

    在Web应用中,有时候需要通过`response.sendRedirect`方法重定向到另一个页面,如果重定向URL中包含中文字符,则可能会出现乱码问题。这是因为默认情况下,浏览器不支持对URL中的中文字符进行编码。为了解决这个问题...

    servlet知识点集锦

    - 在`doGet`或`doPost`方法中,可以通过`response.setCharacterEncoding("UTF-8")`设置字符编码来解决中文乱码问题。 - 需要注意的是,对于客户端发送的数据,通常需要先将数据从ISO8859-1转换为UTF-8格式,然后再...

    java面试时候经常会问的一些问题.doc

    response.sendRedirect() 用于重定向到一个新的 URL,而 forward() 用于将请求转发到一个新的 URL。 3. &lt;%@include file="xxx.jsp"%&gt; 和 &lt;jsp:include&gt; 区别? %@include 指令用于包含一个静态文件,而 ...

    java中JSP和el表达式的隐含对象

    - `encodeRedirectURL(String url)`:对URL进行重写,以便使用`sendRedirect()`方法。 #### out对象 `out`对象用于输出动态生成的内容。它实现了`javax.servlet.jsp.JspWriter`接口,提供了以下方法: - `clear()`...

    面试常遇到的问题

    16. Tomcat 5中文乱码问题: 设置请求编码,如`request.setCharacterEncoding("UTF-8")`,并在JSP中使用`&lt;%@page pageEncoding="UTF-8"%&gt;`。 17. finally语句是否一定执行? 在正常控制流或异常处理后,finally块...

Global site tag (gtag.js) - Google Analytics