【高分求解】UTF8编码JSP通过GET方式接受GBK乱码

jkvast 2013-01-29 05:16:52
各位好,在下遇到个问题,请教大大们解决下

我们知道“中国”这个词的 utf-8编码为 %E4%B8%AD%E5%9B%BD 而 gbk编码为 %D6%D0%B9%FA

现在小弟有个jsp页面是utf-8编码的
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" errorPage="../error.jsp" %>


如果是 test.jsp?name=%E4%B8%AD%E5%9B%BD
→小弟的tomcat的URIEncode设置为utf-8,所以jsp里面获取直接为正常的中文

问题是,现在url的参数是gbk编码的,也就是test.jsp?name=%D6%D0%B9%FA

我想的是,本来是gbk的编码,被tomcat用utf-8传入
所以我

String ttee = new String(request.getParameter("name").getBytes("utf-8"), "gbk");
ttee = new String(ttee.getBytes("gbk"), "utf-8");
//结果乱码
//直接
ttee = new String(request.getParameter("name")); //也是乱码


不知道该怎么处理了

PS:由于这个地址是一个被的项目的回调地址,通过GET方式访问,所以对方传过来的肯定是gbk编码,不能更改,而我自身的项目也是utf-8编码,也不能改,所以在此请教各位高手



...全文
580 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jkvast 2013-10-16
  • 打赏
  • 举报
回复
引用 20 楼 jimmy9495 的回复:
楼主不厚道啊,怎么搞定的也不发出来???我也遇到一样的问题,对方提供的url是GBK,自己项目里TOMCAT又必须是UTF-8的。。。
兄台 不好意思啊,现在才看到你的回复 我是按18的思路做的,不过隔这么久你应该搞定了吧
jimmy9495 2013-07-10
  • 打赏
  • 举报
回复
#18 18楼正解 将军真乃神人也
jimmy9495 2013-07-10
  • 打赏
  • 举报
回复
楼主不厚道啊,怎么搞定的也不发出来???我也遇到一样的问题,对方提供的url是GBK,自己项目里TOMCAT又必须是UTF-8的。。。
jkvast 2013-01-30
  • 打赏
  • 举报
回复
如果大家没看懂我的需求,可以试试这个语句

String text = "中国";
String encode2 = new String(text.getBytes("GBK"), "UTF-8");
//怎么把encode2转成中文
木薯超人 2013-01-30
  • 打赏
  • 举报
回复
AJAX 需要ENCODE 2次才能接收到对的
jkvast 2013-01-30
  • 打赏
  • 举报
回复
引用 9 楼 hucp2007 的回复:
做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。
谢谢您的回复: 不过URL是对方网站直接跳转的,所以URL是不能改,不是我们项目能自己控制的
笑莫问 2013-01-30
  • 打赏
  • 举报
回复
做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。
Danvie 2013-01-30
  • 打赏
  • 举报
回复
引用 4 楼 jkvast 的回复:
引用 3 楼 littlebirdfirst 的回复:引用 2 楼 jkvast 的回复:引用 1 楼 AA5279AA 的回复:说实在,不是很能看懂你说的 这样吧。 一般解决编码的问题是 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 解决的, 你这……
好吧,那你试试楼下的方法,看看结果如何
jkvast 2013-01-30
  • 打赏
  • 举报
回复
引用 2 楼 jkvast 的回复:
引用 1 楼 AA5279AA 的回复:说实在,不是很能看懂你说的 这样吧。 一般解决编码的问题是 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 解决的, 你这样试试,如果不行。 告诉我你传入的是什么编码格式,需要的是什么编码格式。。 反正按照我……
引用 3 楼 littlebirdfirst 的回复:
引用 2 楼 jkvast 的回复:引用 1 楼 AA5279AA 的回复:说实在,不是很能看懂你说的 这样吧。 一般解决编码的问题是 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 解决的, 你这样试试,如果不行。 告诉我你传入的是什么编码格式,需……
引用 5 楼 brightyq 的回复:
uridecode,utf8解码
大家可以这样测试, STEP.1.建立一个jsp内容为

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	System.out.println(name);
%>
STEP.2.设置TOMCAT配置文件 cong/server.xml 在 Connector 节点 添加属性 URIEncoding="UTF-8" STEP.3.在浏览器输入地址 http://localhost/test/test.jsp?name=%D6%D0%B9%FA 观察打印的结果
jkvast 2013-01-30
  • 打赏
  • 举报
回复
引用 5 楼 brightyq 的回复:
uridecode,utf8解码
谢谢兄台回复,但是你可能没看懂我的问题 由于参数是其他项目传过来的,对方在传参数前是不会进行uridecode的, 是直接传的 中国 浏览器 会自动URIEncode为GBK的“%D6%D0%B9%FA” TOMCAT默认会对参数进行URIDecode 所以在代码里面已经不能再使用URIDecode了 如果是我们自己的项目 那直接统一编码,能UriDecode都不需要了
brightyq 2013-01-30
  • 打赏
  • 举报
回复
uridecode,utf8解码
jkvast 2013-01-30
  • 打赏
  • 举报
回复
引用 3 楼 littlebirdfirst 的回复:
引用 2 楼 jkvast 的回复:引用 1 楼 AA5279AA 的回复:说实在,不是很能看懂你说的 这样吧。 一般解决编码的问题是 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 解决的, 你这样试试,如果不行。 告诉我你传入的是什么编码格式,需……
试了不行 因为 默认被tomcat把gkb编码用utf读取进来,所以第一步应该用utf解回来
jkvast 2013-01-30
  • 打赏
  • 举报
回复
OK 搞定结贴
cscript 2013-01-30
  • 打赏
  • 举报
回复
java中utf8和gbk互转是没有直接实现的 所以处理比较麻烦 字符串编码转换不好弄,可以换个思路 楼主可以在jsp中通过requset.getQueryString() 来获取到 %D6%D0%B9%FA 再urldecode 下就得到了 正确的中文了 网上找到这么一个类,就是基于通过自己接卸http的queryString和postdata来处理乱码问题的

public class HttpRequestReader {

	Hashtable pairs = new Hashtable();

	/**
	 * RawParameterReader constructor comment.
	 */
	public HttpRequestReader(HttpServletRequest request, String encoding)
			throws IOException {
		super();
		parse(request.getQueryString(), encoding);
		parse(request.getReader().readLine(), encoding);
	}

	public static String decode(String s, String encoding) throws Exception {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			switch (c) {
			case '+':
				sb.append(' ');
				break;
			case '%':
				try {
					sb.append((char) Integer.parseInt(
							s.substring(i + 1, i + 3), 16));
				} catch (NumberFormatException e) {
					throw new IllegalArgumentException();
				}
				i += 2;
				break;
			default:
				sb.append(c);
				break;
			}
		}
		// Undo conversion to external encoding
		String result = sb.toString();
		byte[] inputBytes = result.getBytes("8859_1");
		return new String(inputBytes, encoding);
	}

	/**
	 * Insert the method's description here. Creation date: (2001-2-4 17:30:59)
	 * 
	 * @return java.lang.String
	 * @param name
	 *            java.lang.String
	 */
	public String getParameter(String name) {
		if (pairs == null || !pairs.containsKey(name))
			return null;
		return (String) (((ArrayList) pairs.get(name)).get(0));
	}

	/**
	 * Insert the method's description here. Creation date: (2001-2-4 17:28:17)
	 * 
	 * @return java.util.Enumeration
	 */
	public Enumeration getParameterNames() {
		if (pairs == null)
			return null;
		return pairs.keys();
	}

	/**
	 * Insert the method's description here. Creation date: (2001-2-4 17:33:40)
	 * 
	 * @return java.lang.String[]
	 * @param name
	 *            java.lang.String
	 */
	public String[] getParameterValues(String name) {
		if (pairs == null || !pairs.containsKey(name))
			return null;
		ArrayList al = (ArrayList) pairs.get(name);
		String[] values = new String[al.size()];
		for (int i = 0; i < values.length; i++)
			values[i] = (String) al.get(i);
		return values;
	}

	/**
	 * Insert the method's description here. Creation date: (2001-2-4 20:34:37)
	 * 
	 * @param urlenc
	 *            java.lang.String
	 */
	private void parse(String urlenc, String encoding)
			throws java.io.IOException {
		if (urlenc == null)
			return;
		StringTokenizer tok = new StringTokenizer(urlenc, "&");
		try {
			while (tok.hasMoreTokens()) {
				String aPair = tok.nextToken();
				int pos = aPair.indexOf("=");
				String name = null;
				String value = null;
				if (pos != -1) {
					name = decode(aPair.substring(0, pos), encoding);
					value = decode(aPair.substring(pos + 1), encoding);
				} else {
					name = aPair;
					value = "";
				}
				if (pairs.containsKey(name)) {
					ArrayList values = (ArrayList) pairs.get(name);
					values.add(value);
				} else {
					ArrayList values = new ArrayList();
					values.add(value);
					pairs.put(name, values);
				}
			}
		} catch (Exception e) {
			throw new java.io.IOException(e.getMessage());
		}
	}
}

在你的jsp中就可以这样使用

	HttpRequestReader paramReader = new HttpRequestReader(request, "gbk");
	String name = paramReader.getParameter("name");
	System.out.println(name);
这样应该就没有问题了
小毛球 2013-01-30
  • 打赏
  • 举报
回复
引用 16 楼 jkvast 的回复:
引用 15 楼 fx_xf 的回复:Get限制Form表单必须为ASCII字符,而url拼好后,浏览器会先URL encode,然后发送给服务器,到底是按照那种编码方式对字符编码,LZ你可以尝试下用IE、CHROME、FIREFOX等打开试试不同处. 解决方法①:浏览器会根据操作系统设置进行编码,需要将操作系统(控制面板-区域和语言选项)regional optio……
LZ可以试试在自己的项目中将URL进行编码在解码。。。 用#15的 解决方法②:uri = encodeURI(uri)在url encode之前再对其编码一次,这样url里面的字符都是ISO-8859-1了。才能正常转码String s = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
jkvast 2013-01-30
  • 打赏
  • 举报
回复
引用 15 楼 fx_xf 的回复:
Get限制Form表单必须为ASCII字符,而url拼好后,浏览器会先URL encode,然后发送给服务器,到底是按照那种编码方式对字符编码,LZ你可以尝试下用IE、CHROME、FIREFOX等打开试试不同处. 解决方法①:浏览器会根据操作系统设置进行编码,需要将操作系统(控制面板-区域和语言选项)regional options中的 Chinese (PRC)……
谢谢您的回复: 不过URL是对方网站直接跳转的,所以URL是不能改,不是我们项目能自己控制的
fx_xf 2013-01-30
  • 打赏
  • 举报
回复
Get限制Form表单必须为ASCII字符,而url拼好后,浏览器会先URL encode,然后发送给服务器,到底是按照那种编码方式对字符编码,LZ你可以尝试下用IE、CHROME、FIREFOX等打开试试不同处. 解决方法①:浏览器会根据操作系统设置进行编码,需要将操作系统(控制面板-区域和语言选项)regional options中的 Chinese (PRC) 改成UNITE STATE ,再试试 。 解决方法②:uri = encodeURI(uri)在url encode之前再对其编码一次,这样url里面的字符都是ISO-8859-1了。才能正常转码String s = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8"); 仅供参考.
linwz520 2013-01-30
  • 打赏
  • 举报
回复
utf-8和gbk之间不可以直接转换 否则你怎么转都会有乱码,utf8下一个汉字是三字节,gbk是两个字节。 需要做下补码处理, public static byte[] gbk2utf8(String chenese) { char c[] = chenese.toCharArray(); byte[] fullByte = new byte[3 * c.length]; for (int i = 0; i < c.length; i++) { int m = (int) c[i]; String word = Integer.toBinaryString(m); StringBuffer sb = new StringBuffer(); int len = 16 - word.length(); for (int j = 0; j < len; j++) { sb.append("0"); } sb.append(word); sb.insert(0, "1110"); sb.insert(8, "10"); sb.insert(16, "10"); String s1 = sb.substring(0, 8); String s2 = sb.substring(8, 16); String s3 = sb.substring(16); byte b0 = Integer.valueOf(s1, 2).byteValue(); byte b1 = Integer.valueOf(s2, 2).byteValue(); byte b2 = Integer.valueOf(s3, 2).byteValue(); byte[] bf = new byte[3]; bf[0] = b0; bf[1] = b1; bf[2] = b2; fullByte[i * 3] = bf[0]; fullByte[i * 3 + 1] = bf[1]; fullByte[i * 3 + 2] = bf[2]; } return fullByte; }
笑莫问 2013-01-30
  • 打赏
  • 举报
回复
引用 10 楼 jkvast 的回复:
引用 9 楼 hucp2007 的回复: 做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。 谢谢您的回复: 不过URL是对方网站直接跳转的,所以URL是不能改,不是我们项目能自己控制的
可以用拦截器嘛,在拦截器中去做url编码转换 另外:像这种接口,服务器提供给客户端用,本来就是要指定编码的,不然以后搞一些日文编码或者其他什么的,服务器不是又要去处理了么。
Danvie 2013-01-29
  • 打赏
  • 举报
回复
引用 2 楼 jkvast 的回复:
引用 1 楼 AA5279AA 的回复:说实在,不是很能看懂你说的 这样吧。 一般解决编码的问题是 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); 解决的, 你这样试试,如果不行。 告诉我你传入的是什么编码格式,需要的是什么编码格式。。 反正按照我……
楼主看这样是否可行,首先解析用GBK编码传入的的值,转换为Utf-8的,再利用,代码: String result=new String(request.getParameter("name").getBytes("GBK"),"utf-8");是否可行??
加载更多回复(2)

62,634

社区成员

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

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