url中文参数传递乱码,搞不明白!

Binary Wang 2008-09-10 04:10:47
两个页面,都采用utf-8编码,
第一个页面向第二个页面传中文参数,
first.jsp

out.println("<a href='second.jsp?&name=" + URLEncoder.encode("中国","utf-8") + "'>中国</a>");

无论是否使用URLEncoder.encode方法进行编码,第二个页面接收到的参数总是乱码,
而且第二个页面不论是否使用URLDecoder.decode方法,得到的一样,都是乱码的那个值。

second.jsp
String name = request.getParameter("name");
System.out.println(name);//涓浗
System.out.println(URLDecoder.decode(name,"utf-8"));//涓浗
...全文
1521 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdfhgfdkh 2008-09-22
  • 打赏
  • 举报
回复
学习。多年前我曾在URL里面传递中文,我导师批我说 用url传中文是犯了低级错误…………
汗……
善桀 2008-09-18
  • 打赏
  • 举报
回复
学习
SoftTop 2008-09-18
  • 打赏
  • 举报
回复
好像这种方式不能传递中文参数的。。。
jqncc 2008-09-18
  • 打赏
  • 举报
回复
建议用resin,乱码很少
程序员长弓 2008-09-18
  • 打赏
  • 举报
回复
如果用的是Tomcat先照这个设置:http://blog.csdn.net/M_ChangGong/archive/2008/08/21/2808021.aspx
然后写个过滤器如下所示:

package com.zyg.filter;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {

public void destroy() {
}

public void doFilter(ServletRequest reqeust, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
reqeust.setCharacterEncoding("utf-8");
chain.doFilter(reqeust, response);
}

public void init(FilterConfig arg0) throws ServletException {
}

}
之后配置在web.xml里面
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>com.zyg.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 wbchn 的回复:]
多谢各位的热心回复。
不过等了这么多回复,都没有我所需要的最简单的,
有些回复可能都没有看我之前的帖子,以致根本不起作用。
我的原则就是不改动现有server.xml中的URIEncoding=GBK的属性设置。

我现在使用以下办法,可以不用修改我已经在server.xml中设置的URIEncoding属性值的情况下不出现乱码,
Java codename=newString(name.getBytes("GBK"),"utf-8");
也就是直接把GBK转为utf-8完成,
但是这个GBK我是写进去的…
[/Quote]

不可能的,如果你要设定 server.xml 中的 URIEncoding=GBK 不动的话,因为在传递参数的过程中
有些编码在GBK 中是不存在的,会转成其他的编码字节,也就是说你在使用

name = new String(name.getBytes("GBK"),"utf-8");

这句之前的编码字节序列中的字节位已经被破坏掉了,因为不同编码间的转换是不可逆的。

编码问题很复杂,并不是像你所想的那样参转来转去的,可以看看下面这个帖子,或许有点参考价值:

http://topic.csdn.net/u/20080623/16/e0f44f00-eaf9-4d38-b325-a3cc443f2ec9.html
無名VF 2008-09-17
  • 打赏
  • 举报
回复
一般处理乱码时都是在接收值时处理的 你那个直接在接收页面处理就OK了。
sunzhyng 2008-09-17
  • 打赏
  • 举报
回复
js里中文的请求编码最好用utf-8,ajax的请求均是以utf-8编码的

encodeURI(url);
xm_bluesky 2008-09-17
  • 打赏
  • 举报
回复
String name = new String(name.getBytes("ISO8859-1"),"GBK");
这样取到的值一定不是乱码
qintao1203 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ctctqiaoyugui 的回复:]
加个过滤器 编码问题轻松搞定
[/Quote]

一样会出现乱码的!
Binary Wang 2008-09-17
  • 打赏
  • 举报
回复
多谢各位的热心回复。
不过等了这么多回复,都没有我所需要的最简单的,
有些回复可能都没有看我之前的帖子,以致根本不起作用。
我的原则就是不改动现有server.xml中的URIEncoding=GBK的属性设置

我现在使用以下办法,可以不用修改我已经在server.xml中设置的URIEncoding属性值的情况下不出现乱码,
name = new String(name.getBytes("GBK"),"utf-8");

也就是直接把GBK转为utf-8完成,
但是这个GBK我是写进去的,
如何从server.xml里取到URIEncoding值是个问题,
没人能告诉我吗?
Binary Wang 2008-09-17
  • 打赏
  • 举报
回复
讨论的太多了,结贴先!
callen17173 2008-09-17
  • 打赏
  • 举报
回复
var url="login.do?method=CheckName&name="+escape(document.getElementById("name").value);
new Ajax(url,{method:'post',onComplete:ComeBack}).request();

使用escape()方法~!
就不会有乱码了
  • 打赏
  • 举报
回复
如果你硬要 GBK 的话,那 URLEncoder.encode("中国","utf-8") 改成 GBK 试试看呢。
Binary Wang 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 bao110908 的回复:]
引用 31 楼 wbchn 的回复:
多谢各位的热心回复。
不过等了这么多回复,都没有我所需要的最简单的,
有些回复可能都没有看我之前的帖子,以致根本不起作用。
我的原则就是不改动现有server.xml中的URIEncoding=GBK的属性设置。

我现在使用以下办法,可以不用修改我已经在server.xml中设置的URIEncoding属性值的情况下不出现乱码,
Java codename=newString(name.getBytes("GBK"),"utf-8");
也就是直接把GBK转为utf…
[/Quote]

多谢火龙大哥,不过实际的情况在我这里确实发生了。
dujun3245350 2008-09-16
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
我这样就行了啊

<%@ page import="java.net.*" contentType="text/html;charset=utf-8"%>

<html>
<head>
<title>My JSP 'csdn.jsp' starting page</title>
</head>
<body>
<br>
<a href="csdn2.jsp?name=<%=URLEncoder.encode("中国", "utf-8")%>">查看</a><br>
</body>
</html>


<%@ page contentType="text/html;charset=utf-8"%>

<html>
<head>
<title>My JSP 'csdn.jsp' starting page</title>
</head>
<body>
<br>
<%=new String(request.getParameter("name").getBytes("iso8859-1"), "utf-8")%>
<br>
</body>
</html>




String name = request.getParameter("name");
System.out.println(name);//涓浗
System.out.println(URLDecoder.decode(name,"utf-8"));//涓浗

你输出的是这个的话,也就是两个字符变成三个了,那也就是说把 UTF-8 的字符转成 GBK 了,
因为 UTF-8 采用三个字节表示一个普通的汉字而 GBK 采用两个,两个 UTF-8 汉字是 6 个字节,
被强制转成 GBK 的话就会变成三个字符。

出现这个问题的原因在于,URI 参数是使用 UTF-8 编码的,而在 server.xml 中的 Connector
里的 URIEncoding 属性被改成“GBK”了。你把它改回来,改成 UTF-8 就行了,那样使用

request.getParameter("name"); 可以直接得到正确的值。

如果你不想改动 server.xml 那就得转码,因为 Tomcat 默认的 URI 传输采用 ISO-8859-1 的编码。
new String(request.getParameter("name").getBytes("iso8859-1"), "utf-8")

zwf88 2008-09-16
  • 打赏
  • 举报
回复
行业潜规则,为什么要在URL中传递中文参数呢? 除非是做给第三方公用的接口,否则在自己的系统里想个办法转换一下还不好办吗? 你看见有多少系统里会给URL中传递中文参数呢。
tianqiao1689 2008-09-16
  • 打赏
  • 举报
回复
name = new String(name.getBytes("ISO-8859-1"), "utf-8");
添加以上语句即可
dongqdonglin 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bao110908 的回复:]
我这样就行了啊

HTML code<%@ page import="java.net.*"contentType="text/html;charset=utf-8"%><html><head><title>My JSP 'csdn.jsp' starting page</title></head><body><br><ahref="csdn2.jsp?name=<%=URLEncoder.encode("中国", "utf-8")%>">查看</a><br></body></html>

Java code<%@ page contentType="text/html;charset=utf-8"%><html><head><title>My JSP'csdn.jsp'starting page</title></head><body><br><%=ne…
[/Quote]火龙果强大
加载更多回复(25)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧