首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2013-02-18 
【高分求解】UTF8编码JSP通过GET方式接受GBK乱码各位好,在下遇到个问题,请教大大们解决下我们知道“中国”这个

【高分求解】UTF8编码JSP通过GET方式接受GBK乱码
各位好,在下遇到个问题,请教大大们解决下

我们知道“中国”这个词的 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编码,也不能改,所以在此请教各位高手



jsp 乱码
[解决办法]
说实在,不是很能看懂你说的
这样吧。
一般解决编码的问题是
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
解决的,
你这样试试,如果不行。
告诉我你传入的是什么编码格式,需要的是什么编码格式。。
反正按照我的理解,
new String(request.getParameter("name").getBytes("utf-8"), "gbk");
你这句写倒了

[解决办法]
引用:
引用:说实在,不是很能看懂你说的
这样吧。
一般解决编码的问题是
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
解决的,
你这样试试,如果不行。
告诉我你传入的是什么编码格式,需要的是什么编码格式。。
反正按照我……


楼主看这样是否可行,首先解析用GBK编码传入的的值,转换为Utf-8的,再利用,代码:
String result=new String(request.getParameter("name").getBytes("GBK"),"utf-8");是否可行??
[解决办法]
uridecode,utf8解码
[解决办法]
做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。
[解决办法]
引用:
引用:
做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。

谢谢您的回复:

不过URL是对方网站直接跳转的,所以URL是不能改,不是我们项目能自己控制的

可以用拦截器嘛,在拦截器中去做url编码转换
另外:像这种接口,服务器提供给客户端用,本来就是要指定编码的,不然以后搞一些日文编码或者其他什么的,服务器不是又要去处理了么。
[解决办法]
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;
}
[解决办法]
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");

仅供参考.
[解决办法]

引用:
引用: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");
[解决办法]
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);


这样应该就没有问题了

热点排行