超链中文乱码解决方案


 

由于项目的需要,很多地方需要打开超链接链接到一个网址,当网址中存在中文,会经常出现乱码而打不开目标网址,原因项目采用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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值