由于项目的需要,很多地方需要打开超链接链接到一个网址,当网址中存在中文,会经常出现乱码而打不开目标网址,原因项目采用UTF-8统一编码,而其它网站的编码方式个各不相同,有中文就有可能出现乱码。
例:在JSP中打开如下超链接
<a href="http://tieba.baidu.com/f?kw=新宋">新宋</a>
在百度的搜索框中显示的将会是乱码,而得不到预期的结果。
解决方法:使用 js将URL当作参数发送给servlet请求,通过servlet对其中的URL带有的参数进行转码,然后请求派发重新打开。
代码如下:public class CodeServlet extends HttpServlet {
/*
* (non-Javadoc)
*
* @see
* javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest
* , javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String url = req.getParameter("url");
//String url = "http://tieba.baidu.com/f?kw=新宋";
// String url
// ="http://search8.taobao.com/browse/search_easy.htm?keyword=人气女装&catid=16&isinner=1&refpid=mm_15485148_2226654_8733651&refpos=&posid=4 ";
int index = url.indexOf("?");
if (index != -1) {
StringBuffer sb = new StringBuffer();
String pre = url.substring(0, index + 1);
String next = url.substring(index + 1);
String param[] = next.split("&");
for (String str : param) {
String[] comb = str.split("=");
sb.append(comb[0] + "=");
if (comb.length > 1) {
String value = setCode(comb[1], "GBK");
sb.append(value);
}
sb.append("&");
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
url = pre + sb.toString();
}
resp.sendRedirect(url);
}
/*
* (non-Javadoc)
*
* @see
* javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
* , javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
/**
*
* @Title: setCode
* @Description: TODO(设置字符串的编码)
* @param str
* @param encode
* @return
* @throws UnsupportedEncodingException
* @return String 返回类型
* @throws
*/
private String setCode(String str, String encode)
throws UnsupportedEncodingException {
StringBuffer sb = new StringBuffer();
char[] charArray = str.toCharArray();
for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];
if (c == '%') {
sb.append(c);
sb.append(charArray[i + 1]);
sb.append(charArray[i + 2]);
i = i + 2;
} else {
sb.append(changeCode(c + "", encode));
}
}
return sb.toString();
}
/**
*
* @Title: setCode
* @Description: TODO(改变字符串的编码)
* @param str
* @param encode
* @return
* @throws UnsupportedEncodingException
* @return String 返回类型
* @throws
*/
private String changeCode(String str, String encode)
throws UnsupportedEncodingException {
str = URLDecoder.decode(str, encode);
str = URLEncoder.encode(str, encode);
return str;
}
servlet配置:
<servlet>
<servlet-name>redirect</servlet-name>
<servlet-class>com.shunwang.code.servlet.CodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>redirect</servlet-name>
<url-pattern>/redirect.do</url-pattern>
</servlet-mapping>
JS函数:
function openUrl(url){
window.open("http://localhost:8088/redirect/redirect.do?url=" + encodeURIComponent(url));
}
红色出主意修改!
tomcat编码设置:
<Connector port="8088" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
最后通过JS函数打开URL则结果正确!
测试如下网址:http://search8.taobao.com/browse/search_easy.htm?keyword=人气女装&catid=16&isinner=1&refpid=mm_15485148_2226654_8733651&refpos=&posid=4
也同样正确!
以上个人解决方法,谁用更好的方法可以交流下,如测试某网址有问题也可以联系我 QQ:980810489