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

在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() ;    
	          }  
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值