【高分求解】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");
你这句写倒了
[解决办法]
楼主看这样是否可行,首先解析用GBK编码传入的的值,转换为Utf-8的,再利用,代码:
String result=new String(request.getParameter("name").getBytes("GBK"),"utf-8");是否可行??
[解决办法]
uridecode,utf8解码
[解决办法]
做个编码转换吧,把客户端请求URL先转换成utf8编码,然后去请求服务器。
[解决办法]
可以用拦截器嘛,在拦截器中去做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");
仅供参考.
[解决办法]
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);
这样应该就没有问题了