由於項目的需要,很多地方需要打開超鏈接鏈接到一個網址,當網址中存在中文,會經常出現亂碼而打不開目標網址,原因項目採用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