- 浏览: 1001713 次
文章分类
最新评论
-
18335864773:
很多公司项目 都在使用pageoffice 来操作word,e ...
用java生成word文档 -
Gozs_cs_dn:
请问下博主, 怎样将sitemesh3.xsd绑定 sitem ...
SiteMesh3配置 -
Rose_06:
springside4.0quick-start.bat报错原因 -
ilemma:
我也是刚参见工作啊,经理让自学这个,有些东西不太懂,能不能发个 ...
Apache Shiro在Web中的应用 -
shanbangyou:
你废了
程序员上班打酱油的方法
JSP中文传参数乱码问题。
如果是post加过滤器或者加入
request.setCharacterEncode("gbk")(管输入)
response.setCharacterEncode("gbk")(管输出)
如果是url的get提交参数带中文的
可以改下面这个文件,加入一个URIEncoding="GBK"
X:\Tomcat \conf\Server.xml
- <Connector
- port="8080"
- redirectPort="8443"
- minSpareThreads="25"
- connectionTimeout="30"
- maxThreads="150"
- maxSpareThreads="75"
- URIEncoding="GBK">
一、概况:ie7正常,ie6参数就会出现中文接受信息错误,表现为长度是奇数时最后一个字符出现乱码。
二、具体表现:
1、全是汉字时,无论奇数还是偶数,都无乱码。
2、如果是英文中文混合,并且英文字符数是奇数时,就会出现最后有一个“?”号。
3、如果是英文中文混合,并且英文字符数是偶数时,无乱码。
三、原因:ie7支持UTF8编码,但是ie6支持不好。
环境: jdk1.5,tomcat5.5,ie6.0 ,所有jsp页面,xml配置文件URIEncoding 都设置成utf-8,也保存成utf-8格式。
当用ie提交时,单个汉字会出现这个问题。(如果所有的都设置成gbk,则不会出现此问题)
开始以为是tomcat源码问题,通过跟踪tomcat,调试 tomcat org.apache.coyote.http11.Http11BaseProtocol.java可知:
如果输入单汉字“你”->tomcat的侦听的byte流应该时:%E4%BD%A0,而实际收到的是 %E4%BD,第3个byte没有收到。
而同样的配置,如果用firefox1.5测试,则完全正常。!!!!!
所以,这个是ie发送信息时转码错误!!
四、解决方法:
1、用post发送,这个方法当然不出错了,但是,有时候必须用get传递参数的方法,那就没辙了,只能用第二个方法。
2、习惯把中文字符串显示长度设置为偶数。
现在的处理逻辑是:在业务方法里进行判断,如果输入的字符个数为奇数,则给其拼接上一个全角的空格,如果是半角的空格,也还是会有乱码问题。
当你要传值时,故意在汉字结尾处加一个半角字符,比如:
index.jsp?name=我爱你_
我要传的是“我爱你”,但是我故意加一个“_”在后面。
然后在servlet里接收时,用substring()去掉这个“_”:
String name = request.getParameter("name");
name = name.substring(0, name.length()-1);
在网页中的超链接,例如 <a href="/servlet?id=1&name=世界">click me</a>,如果超链接里的地址有中文就如上面的'name=世界'一样,即使在web.xml中设置转换字符集的filter,在servlet中得到的值还是乱码。下面是我的几个实验,
(1) 首先,在web.xml中没有字符集转换的filter下,在表单中提交中文的情况,HTML片段如下
- <form action="./servlet/MyServlet" method="get">
- <input type="text" name="name">
- <input type="submit">
- </form>
<form action="./servlet/MyServlet" method="get"> <input type="text" name="name"> <input type="submit"> </form>
在文本框中输入'世界', 毫无疑问这个时候在servlet中得到的name的值是乱码 例如:name = ????
(2)现在再把form中的method方法换成post并且仍然是在web.xml中没有字符集转换的filter下,看在表单中提交中文会不会有乱码,HTML片段如下
- <form action="./servlet/MyServlet" method="post">
- <input type="text" name="name">
- <input type="submit">
- </form>
<form action="./servlet/MyServlet" method="post"> <input type="text" name="name"> <input type="submit"> </form>
在文本框中输入'世界', 这个时候在servlet中得到的name的值仍然是乱码 例如:name = ????
(3)现在在web.xml中加入字符集转换的filter,代码如下
- <filter>
- <filter-name>Set Character Encoding</filter-name>
- <filter-class>filters.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GBK</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Set Character Encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
<filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
(4)现在咱们还是现在form的method属性是get时候进行测试,在文本框中输入世界,然后在servlet中得到的name值仍然是乱码,name = ????
(5)然后再在form的method属性是post时候进行测试,在文本框中输入世界,然后在servlet中得到的name值就是正常的值的没有乱码。
我现在用的浏览器是IE,就是表单提交中文时候,如果正确的设置了字符集转换的filter,那么在form中的post方法中提交时,在servlet中得到的正常的值,如果在form中的get方法中提交时候,得到的中文数据居然是乱码,这个有点不可思议。
(6)然后在同样的环境下,在超链接的href属性中提交中文参数值,例如
<a href='./servlet/MyServlet?name=世界>click me</a> <br>
在servlet中得到的是乱码。在这种情况下在servlet中进行转码。例如,
- try {
- name = new String(name.getBytes("ISO-8859-1"), "gbk");
- } catch(Exception e) {
- e.printStackTrace();
- }
try { name = new String(name.getBytes("ISO-8859-1"), "gbk"); } catch(Exception e) { e.printStackTrace(); }
或者
java.net.URLDecoder.decode(name) 通过这个语句进行转码也是可以得到正常值的。
(7)同样是在有字符集转换的filter下,在JSP中使用JSTL的 <c:url>标签是否可以避免乱码吗,使用如下的标签
- <c:url value="./servlet/MyServlet" var="url">
- <c:param name="name" value="${'世界'}" />
- </c:url>
- <a href="${url}">Hello</a> <br>
<c:url value="./servlet/MyServlet" var="url"> <c:param name="name" value="${'世界'}" /> </c:url> <a href="${url}">Hello</a> <br>
然后在servlet中得到的仍然是乱码,仍然需要(6)中介绍的方法进行转换,才能得到正确的值。
(8)通过post方法提交的表单中的中文值是不需要通过(6)中的进行转码的,如果进行转码的话,反而会造成乱码。那么,在serlvet中,如果让这两种提交方式(超链接提交和表单post方法)都通用的话,如果超链接的值没有中文的话是可以实现通用的,如果超链接提交的参数有中文的话,就会出现问题,那么就必须在超链接提交的URL中另加一个额外的参数来标识是从哪里提交的,以此来决定是否需要对特定的值进行转化。有没有更好的办法在超链接里提交中文时候在servlet中不进行转码呢。答案就是(5)。如果把超链接提交转化为表单的post提交,中文就不会出现乱码,见(9)
(9)
- function linkClick(linkObject) {
- var formObject = document.createElement('form');
- document.body.appendChild(formObject);
- formObject.setAttribute('method', 'post');
- var url = linkObject.href;
- var uri = '';
- var i = url.indexOf('?');
- if(i == -1) {
- formObject.action = url;
- } else {
- formObject.action = url.substring(0, i);
- }
- if( i >= 0 && url.length >= i + 1) {
- uri = url.substring(i + 1, url.length);
- }
- var sa = uri.split('&');
- for(var i = 0; i < sa.length; i++) {
- var isa = sa[i].split('=');
- var inputObject = document.createElement('input');
- inputObject.setAttribute('type', 'hidden');
- inputObject.setAttribute('name', isa[0]);
- inputObject.setAttribute('value', isa[1]);
- formObject.appendChild(inputObject);
- }
- formObject.submit();
- return false;
- }
function linkClick(linkObject) { var formObject = document.createElement('form'); document.body.appendChild(formObject); formObject.setAttribute('method', 'post'); var url = linkObject.href; var uri = ''; var i = url.indexOf('?'); if(i == -1) { formObject.action = url; } else { formObject.action = url.substring(0, i); } if( i >= 0 && url.length >= i + 1) { uri = url.substring(i + 1, url.length); } var sa = uri.split('&'); for(var i = 0; i < sa.length; i++) { var isa = sa[i].split('='); var inputObject = document.createElement('input'); inputObject.setAttribute('type', 'hidden'); inputObject.setAttribute('name', isa[0]); inputObject.setAttribute('value', isa[1]); formObject.appendChild(inputObject); } formObject.submit(); return false; }
下面是html代码
- <a href='./servlet/MyServlet?name=世界&id=1' onclick="return linkClick(this)">click me</a> <br>
<a href='./servlet/MyServlet?name=世界&id=1' onclick="return linkClick(this)">click me</a> <br>
这样就OK了,在linkClick方法里面会自己创建一个表单,然后会去解析你的参数并自动转化成hidden,并给hidden域赋值,这样,再也不怕提交中文参数,并且也不需要在servlet中进行麻烦的转码,真是一劳永逸啊,但是需要在JSP的超链接中加上上面的方法。上面的程序用的是IE6和tomcat5。
2.
请求参数,需要编码
<a href="newsAction?name=<%=java.net.URLEncoder.encode("表数据管理","UTF-8")%>"
target="frameset">Xls表数据管理 </a>
假如是java代码的话直接写java.net.URLEncoder.encode("测试吗","UTF-8");
下面引用Qieqie的一段代码:
public static void main(String[] args) throws UnsupportedEncodingException { //给定某3个汉字 String src = "你好啊"; //String src = "一二三"; //浏览器进行utf-8编码,并传送到服务器 byte[] bytes1 = src.getBytes("utf-8"); System.out.println(bytes1.length);//9 //tomcat以gbk方式解码(这个片段的说明仅针对gbk处理汉字的情况) //如果一对汉字字节不符合gbk编码规范,则每个字节使用'?'(ascii 63)代替 //万幸的话,只是最后一个(第9个)字节因不能成对,变成问号(比如当src="你好啊"时) //不幸的话,中间某些字节就通不过gbk编码规范出现'?'了(比如当src="一二三"时) //总之temp的最后一位必定是问号'?' String temp = new String(bytes1, "gbk"); //你的action中的代码 //由于以上的tomcat以gbk解释utf-8不能成功 //所以此时bytes2和bytes1不一样 byte[] bytes2 = temp.getBytes("gbk"); System.out.println(bytes2.length); for (int i = 0; i < bytes1.length; i++) { System.out.print(bytes1[i] & 0xff); System.out.print("\t"); } System.out.println(); for (int i = 0; i < bytes2.length; i++) { System.out.print(bytes2[i] & 0xff); System.out.print("\t"); } System.out.println(); //构建出来的dest自然不是原先的src String dest = new String(bytes2, "utf-8"); System.out.println(dest); }
发表评论
-
代写java程序qq:928900200
2014-06-18 12:46 3学校为全面提升学校教学质量,提高管理水平,决定开发一套小型成 ... -
销售管理需求分析
2013-07-03 08:18 4991. 概述 目前,销售管理在企业管理中 ... -
基于jsp+servlet+jdbc的销售管理
2013-07-02 16:32 7源码http://apenny.taobao.com 1 ... -
基于jsp邮件收发系统用javamail包
2012-11-29 15:32 597基于jsp邮件收发系统用javamail包 ... -
jsp连接h2例子
2012-05-10 20:30 1126一、通过server形式连接 1.将h2.jar复制到web ... -
遇到get乱码前端编码要两次
2012-05-04 14:40 636<a id="t" href=&q ... -
基于Myeclipse9.1的spring3.1MVC开发搭建
2011-10-01 14:27 2014(1)配置基础装备。每个符合Java EE规范的web应用程 ... -
jsp post乱码解决
2011-05-10 09:18 15003条语句解决post乱码 输入页加: < ... -
get post乱码解决
2011-04-13 11:25 450如果是post加过滤器 如果是url的get提交参数带 ... -
jsp根据时间显示内容
2011-03-26 21:34 516<%java.util.Date dt=new java ... -
网页抓取例子
2010-08-12 15:38 778<%@ page contentType="t ... -
不允许从数据类型 ntext 到数据类型 varchar 的隐性转换
2010-04-22 09:50 2300虽然SQL Server 2000的varchar类型最大可以 ... -
session 对新开窗口无效
2009-04-14 21:50 1119出现问题: session 对 ... -
地址栏图标
2009-04-10 14:52 1864很多新手经常会问道,地址栏里域名http前面的小图标(网址前面 ... -
jsp 判断是否登录
2009-04-10 09:45 2549jsp 判断 是否登录, 每个页面判断,代码重复。 可以使 ... -
jsp response.sendRedirect 报错 加return
2009-04-05 19:14 1637ResponseFacade.sendRedirect(Res ... -
jsp url传递中文参数
2009-04-05 17:58 1646均按utf-8编码 <%@ page contentTy ... -
tomcat6配置数据源
2009-04-04 08:50 1053Tomcat 5的数据源配置跟Tomcat 5.5的数据源配置 ... -
tomcat不能访问中文名文件问题解决办法
2009-03-30 15:27 18251、把这句加到你的jsp文件最开头(这里是解决中文不能显示的问 ... -
jsp javamail发送html邮件
2009-02-25 21:36 2236<%@ page language="java ...
相关推荐
在Java Web开发中,经常遇到的一个问题是处理GET请求中的中文参数时出现乱码。这个问题主要是因为浏览器发送GET请求时,参数默认使用ISO-8859-1编码格式,而服务器端通常采用的是其他编码(如GBK、UTF-8等)。当...
由于Tomcat默认采用ISO-8859-1编码处理请求,这种编码不支持中文字符,导致中文字符在接收时显示为乱码。本文将深入探讨如何修改Tomcat的默认编码设置,以解决GET方式传递参数时出现的中文乱码问题。 #### Tomcat...
然而,在处理中文参数时,尤其是通过GET和POST方法传递时,经常会出现乱码问题。这通常是由于字符编码不一致或者处理不当导致的。以下是对这一问题的详细解析: 首先,我们需要理解字符编码的基本概念。在Web中,...
Sqlite3是一个轻量级的数据库引擎,它在处理中文字符时也有类似的问题。若不正确设置字符集,存储和检索中文数据时可能会出现乱码。 解决方法: - 创建数据库时指定编码:使用`PRAGMA encoding = 'UTF-8';`语句...
当我们需要在两个页面间通过URL传递参数时,经常会遇到中文乱码问题。这个问题主要是因为URL中的参数可能没有经过正确的编码和解码处理。为了解决这个问题,我们可以采取一些方法,特别是当使用jQuery来获取URL参数...
GET请求中的参数是通过URL直接传递的,当参数包含中文字符时,如果URL编码不正确或者服务器端没有正确地解码这些参数,就会出现乱码问题。主要原因包括: 1. **客户端与服务器端编码不一致**:客户端发送请求时使用...
在Spring MVC框架中,处理HTTP GET请求时遇到中文乱码问题是一个常见的开发难题。这个问题主要源于请求参数在URL中编码时使用的是UTF-8以外的字符集,导致服务器接收到的参数解码后出现乱码。本文将深入探讨这个问题...
在Java Web开发中,我们经常会遇到GET请求参数乱码的问题,尤其是在处理包含中文字符的URL时。这个问题可以通过使用Servlet Filter来解决。过滤器(Filter)是Java Servlet API的一部分,允许我们在请求到达目标...
在 Web 开发中,中文乱码问题是一个常见的问题,尤其是在FORM表单传递参数时。这个问题的根本原因是对中文的编码与解码方式不一致。我们可以理解为对中文的加密与解密的密钥不一致。例如,用UTF-8对中文编码而用ISO-...
在IT领域,尤其是在Java开发中,GET请求的乱码问题是开发者经常会遇到的一个难题。这个问题主要源于字符编码的不一致,特别是在处理中文或者其他非英文字符时更为显著。下面将详细解析GET请求乱码的原因、解决方案...
首先,我们需要理解中文乱码问题产生的原因。当HTTP请求发送含有中文字符的数据时,如果编码格式不一致或未正确指定,接收端就可能无法正确解码,从而导致乱码。HTTP协议本身并不规定字符编码,而是依赖于Content-...
在 Web 开发中,乱码问题是常见的难题之一。乱码问题的出现主要是由于编码不一致引起的。编码不一致可能出现在多个方面,如页面编码、服务器编码、客户端编码、数据库编码等。在本文中,我们将详细介绍乱码问题的...
在处理中文字符时,由于编码不一致或者处理不当,往往会出现乱码现象。以下是一些关键的知识点和解决方案: 1. **字符编码设置**:HttpClient默认可能不会自动处理服务器返回的字符集,因此需要明确指定编码。在...
在进行Web开发时,我们经常会遇到Ajax GET请求发送中文参数时出现乱码的问题。这个问题主要源于HTTP协议在处理非ASCII字符时的编码不一致。在本文中,我们将深入探讨这个问题,以及如何通过不同的方法来解决它。 ...
在Java进行HTTP请求时,通常会遇到数据传输出现乱码的问题,尤其是在使用JSON格式传输数据,且数据中包含中文字符时更为常见。在HTTP协议中,字符编码的正确处理对于数据的正确传输至关重要。以下将详细介绍在Java中...
在这个例子中,Gson库默认使用UTF-8编码,因此在处理中文字符时通常不会出现问题。 总之,处理JSON操作中的中文乱码问题,关键在于确保数据的编码和解码过程中使用了UTF-8。在前端,jQuery的`$.getJSON`已经做了很...
有时候,我们在中文系统平台下开发的 Web 应用程序移植到英文系统平台下,在 Servlet 和 JSP 中直接书写的中文字符串在输出时,将显示为乱码。这是因为在编译 Servlet 类或者 JSP 文件时,如果没有使用 -encoding ...
因此,当在URL中使用非ASCII字符时,需要将其转换为百分号编码(%xx)的形式,这是一个标准的ASCII字符序列,其中xx代表该字符的十六进制值。JavaScript中的`encodeURI()`函数就是用于此目的的,它会对URL中的特殊...
JSP 中文乱码问题解决办法 JSP 页面中中文乱码问题是指在 JSP 页面中使用中文时,页面显示...解决 JSP 中文乱码问题需要从多方面入手,包括设置页面的字符编码、使用 POST 方式提交表单、使用 GET 方式提交表单等。