【高分求解】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" %>
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")); //也是乱码
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");
仅供参考.
[解决办法]
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());
}
}
}
HttpRequestReader paramReader = new HttpRequestReader(request, "gbk");
String name = paramReader.getParameter("name");
System.out.println(name);