超鏈中文亂碼解決方案


 

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

 

發佈了19 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章