`
tianmingqi
  • 浏览: 118595 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

通过表单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() ;    
	          }  
}

 

 

分享到:
评论
1 楼 yajie 2009-05-20  
顶你个费,在你那适用,别的地方就不行了。
encoding--
escape:????
unescape:
gettting--------->k=????
POST--escape:????
POST--unescape:
encoding:UTF-8
未编码前:????
自动编码:????
强制编码:????
-次编码后:????
二次编码后:????

相关推荐

    解决jsp提交乱码的问题

    ### 解决JSP提交乱码的...同时,对于GET请求,可以通过修改Tomcat配置或使用`URLEncoder.encode()`方法来解决乱码问题;对于POST请求,则需要关注表单的`enctype`属性以及`request.setCharacterEncoding()`方法的使用。

    jspurl中中文参数的乱码解决.docx

    在IT行业中,尤其是在Web开发领域,处理中文参数的乱码问题是一个常见的挑战。本文主要讨论的是JSP中URL中中文参数导致的乱码问题及其解决方案。 首先,让我们深入理解HTTP请求的基本原理。HTTP请求有两种主要的...

    ssh(structs,spring,hibernate)框架中的上传下载

     其中save(FileActionForm fileForm)方法,将封装在fileForm中的上传文件保存到数据库中,这里我们使用FileActionForm作为方法入参,FileActionForm是Web层的表单数据对象,它封装了提交表单的数据。将...

    JSP页面中文参数的传递(get和post方法分析)

    在实际开发中,为了减少中文乱码问题的发生,建议: - 在JSP页面的头部统一设置字符编码,并确保整个项目中使用的字符编码一致。 - 使用POST方法传递中文参数,避免在URL中直接暴露中文参数。 - 对于GET方法传递的...

    jsp中四种传递参数的方法

    当使用 GET 方法提交时,表单数据会附加在 URL 后面,可能会出现中文乱码。解决方法是,先将获取到的参数值转换为字节数组,再转换成指定编码格式的字符串。 ```java String name = request.getParameter("name"); ...

    request请求获取参数的实现方法(post和get两种方式)

    在Web开发中,请求参数的获取是至关重要的,它涉及到用户与服务器之间的数据交互。本文主要探讨了通过HTTP协议的GET和POST两种方法在Java ...注意,处理POST请求时,确保设置正确的字符编码,以避免中文乱码问题。

    Java学习笔记

    表单提交方法通常有两种:GET和POST。这两种方法的主要区别在于: - **GET**: - 数据附加在URL后面,可见于地址栏。 - 适合用于提交不敏感信息,如搜索查询。 - 数据长度有限制(一般不超过2KB)。 - **POST**...

    HTML基础语法

    - **超链接 `&lt;a&gt;`**:用于链接到其他页面或跳转到页面内部的锚点。 - `href`属性:链接目标的URL。 - `target`属性:指定在哪个窗口或框架打开链接。 - `_blank`:新窗口或新标签页。 - `_self`:当前窗口或框架...

    HttpClient以及获取页面内容应用

    List&lt;NameValuePair&gt; formparams = new ArrayList&lt;NameValuePair&gt;(); formparams.add(new BasicNameValuePair("username", "admin")); formparams.add(new BasicNameValuePair("password", "123456")); ...

    html——div的总结

    表单元素中,`&lt;FORM&gt;`定义表单,`action`指定处理表单数据的URL,`method`指定提交方法(通常是POST或GET),`maxlength`限制输入长度,`checked`表示复选框或单选框是否默认选中。`&lt;SELECT&gt;`创建下拉列表,`...

    lotus domino BS开发 路徑地址傳值

    - 示例代码展示了如何通过`window.open()`传递参数,包括中文字符,并在目标页面使用JavaScript函数`getQuery()`获取这些参数。 7. **JavaScript与正则表达式**: - 正则表达式在`getQuery()`函数中用来匹配并...

    PHP面试题(最牛)

    实现中文字串截取无乱码的方法 可以使用`mb_substr()`函数来处理多字节字符集,避免截取过程中出现乱码。 **示例代码**: ```php $string = "你好世界"; $substring = mb_substr($string, 0, 2, 'utf-8'); echo $...

    PHP面试题汇总附答案

    表单中GET与POST提交方法的区别 - **GET**:将表单数据附加到URL之后,以问号分隔并在浏览器的地址栏中可见。GET请求的数据会受到URL长度的限制(大约2K左右),并且不适合发送敏感信息,因为数据在URL中可见。 - ...

    PHP笔试题-归宗

    GET与POST提交方法的区别 GET和POST是HTTP协议中两种常用的请求方式,在Web开发中用于用户向服务器发送数据。主要区别在于: - **安全性**:GET方式通过URL传输参数,容易暴露敏感信息;而POST方式将数据放在请求...

    一份超级全面的PHP面试题

    - **知识点**:可以使用cURL或file_get_contents()函数来获取网页内容。 ### 18. 在HTTP1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可以用报名地址:上海市徐汇区番禺路868号(2分) - **状态...

    关于request.getHeader(&quot;Referer&quot;)的问题探讨

    其次,如描述中提到的,通过`window.location` JavaScript方法或者使用`location.href`进行页面跳转不会发送`Referer`。这是因为这些方式不是标准的HTTP请求,而是浏览器内部的页面重定向,它们不会更新浏览器的历史...

    PHP+MYSQL实现用户的增删改查

    - `mysql_query('set NAMES utf8')`:这行代码设置数据库连接的字符集为UTF-8,确保在处理中文字符时不会出现乱码问题。 3. **HTML与PHP结合**: - 在`userListt.php`中,HTML表格用于显示用户信息列表,而PHP...

    超级全面的PHP面试题整理集合第1/2页

    可以使用`$_SERVER['SCRIPT_FILENAME']`获取脚本的完整路径,使用`$_GET`或`$_POST`获取参数。 ### 27.如何修改SESSION的生存时间.(1分) 可以通过设置`ini_set('session.gc_maxlifetime', 1440)`来修改。 ### 28...

Global site tag (gtag.js) - Google Analytics