通过表单get方法,或使用<a href....>提交汉字参数的乱码问题

本文介绍在Struts2框架中如何处理GET请求的中文乱码问题,并提供了一个实用工具类,用于字符串的UTF-8编码和解码。

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

在struts2.0中,把所有编码设置为utf-8,表单使用post方法提交,在服务器端取得的汉字数据不会出现乱码。

但是如果使用get方法提交,就会出现编码。

开始认为:以后全使用post方法不就行了嘛!

但是又遇到了这样的情况:

<a href="test.action?name='你好'">链接</a>

如果使用这样的方法提交参数与使用get方法提交表单是一样的,参数都会在地址栏中显示,如下:

http://localhost:8080/test/test.action?name=%E4%BD%A0%E5%A5%BD

 

 

但是这个中文参数在服务器端显示是乱码的。可以使用以下处理将其不乱码,下面是一个具有汉字与型如“%E4%BD%A0%E5%A5%BD ”相互转换的工具类:

package com.shiyihr.util;

public class CodingUtil {
	//将汉字转换为%E4%BD%A0%E5%A5%BD形式
	public static String toUtf8String(String s) {    
	          StringBuffer sb = new StringBuffer();    
	          for (int i = 0; i < s.length(); i++) {    
	                  char c = s.charAt(i);    
	                  if (c >= 0 && c <= 255) {    
	                          sb.append(c);    
	                  } else {    
	                          byte[] b;    
	                          try {    
	                                  b = String.valueOf(c).getBytes("utf-8");    
	                          } catch (Exception ex) {    
	                                  System.out.println(ex);    
	                                  b = new byte[0];    
	                          }    
	                          for (int j = 0; j < b.length; j++) {    
	                                  int k = b[j];    
	                                  if (k < 0)    
	                                          k += 256;    
	                                  sb.append("%" + Integer.toHexString(k).toUpperCase());    
	                          }    
	                  }    
	          }    
	          return sb.toString();    
	  }    
	   
	//将%E4%BD%A0%E5%A5%BD转换为汉字    
	 public static String unescape(String s) {    
	            StringBuffer sbuf = new StringBuffer () ;    
	            int l  = s.length() ;    
	            int ch = -1 ;    
	            int b, sumb = 0;    
	            for (int i = 0, more = -1 ; i < l ; i++) {    
	              /* Get next byte b from URL segment s */   
	              switch (ch = s.charAt(i)) {    
	                case '%':    
	                  ch = s.charAt (++i) ;    
	                  int hb = (Character.isDigit ((char) ch)     
	                            ? ch - '0'    
	                            : 10+Character.toLowerCase((char) ch) - 'a') & 0xF ;    
	                  ch = s.charAt (++i) ;    
	                  int lb = (Character.isDigit ((char) ch)    
	                            ? ch - '0'    
	                            : 10+Character.toLowerCase ((char) ch)-'a') & 0xF ;    
	                  b = (hb << 4) | lb ;    
	                  break ;    
	                case '+':    
	                  b = ' ' ;    
	                  break ;    
	                default:    
	                  b = ch ;    
	              }    
	              /* Decode byte b as UTF-8, sumb collects incomplete chars */   
	              if ((b & 0xc0) == 0x80) {                        // 10xxxxxx (continuation byte)    
	                sumb = (sumb << 6) | (b & 0x3f) ;        // Add 6 bits to sumb    
	                if (--more == 0) sbuf.append((char) sumb) ; // Add char to sbuf    
	              } else if ((b & 0x80) == 0x00) {                // 0xxxxxxx (yields 7 bits)    
	                sbuf.append((char) b) ;                        // Store in sbuf    
	              } else if ((b & 0xe0) == 0xc0) {                // 110xxxxx (yields 5 bits)    
	                sumb = b & 0x1f;    
	                more = 1;                                // Expect 1 more byte    
	              } else if ((b & 0xf0) == 0xe0) {                // 1110xxxx (yields 4 bits)    
	                sumb = b & 0x0f;    
	                more = 2;                                // Expect 2 more bytes    
	              } else if ((b & 0xf8) == 0xf0) {                // 11110xxx (yields 3 bits)    
	                sumb = b & 0x07;    
	                more = 3;                                // Expect 3 more bytes    
	              } else if ((b & 0xfc) == 0xf8) {                // 111110xx (yields 2 bits)    
	                sumb = b & 0x03;    
	                more = 4;                                // Expect 4 more bytes    
	              } else /*if ((b & 0xfe) == 0xfc)*/ {        // 1111110x (yields 1 bit)    
	                sumb = b & 0x01;    
	                more = 5;                                // Expect 5 more bytes    
	              }    
	              /* We don't test if the UTF-8 encoding is well-formed */   
	            }    
	            return sbuf.toString() ;    
	          }  
}

 

 

<%-- Created by IntelliJ IDEA. User: 86150 Date: 2025/5/13 Time: 22:07 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!--引入需要的Java包,CreditDao和Credit是本系统处理课程信息数据库访问的Java类--> <%@ page import="model.CreditDao" %> <%@ page import="model.Credit" %> <%@ page import="java.util.List"%> <html> <head> <title>Title</title> <%//创建一个CreditDao对象,用于执行对数据库的检索、删除和编辑操作 CreditDao crd=new CreditDao(); //定义页面数据列表,其数据由CreditDao类的getCredit()方法从数据库中检索出来 List<Credit>crlist=crd.getCredit(); %> </head> <body> <table width="400"> <tr> <td>课程号</td> <td>课程名</td> <td>学分</td> <td></td> <td></td> </tr> <%//设置传递和接收的参数编码为utf-8,防止中文字符乱码 response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); //页面显示crlist中的查询结果 for(int i=0;i<crlist.size();i++){ Credit cr= crlist.get(i); String cno=cr.getCno(); out.print("<tr>"); out.print("<td>"+cr.getCno()+"</td>"); //显示cno out.print("<td"+cr.setCname()+"</td>"); //显示cname out.print("<td>"+cr.getCcredit()+"</td>");//显示ccredit %> <!--单击编辑按钮时,跳转到 update.jsp,并将参数传递到对应页面--> <td><a href="update.jsp cno= =cr.getCno()%> &cname=< =cr.getCname()&> &ccredit=<%=cr.getCcredit()%>">编辑</a></td> <!-单击删除按钮时,跳转到delete.jsp,执行删除操作--> <td><a href="delete.jsp?cno=<%=cr.getCno() %>&cname=<%=cr.getCname()%> &ccredit=<%=cr.getCcredit()%>">删除</a></td> <% out.print("</tr>"); } %> </table> </body> </html>'model.Credit' 中的 'setCname(java.lang.String)' 无法应用于 '()'
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值