如何以正确的格式阅读网址?

时间:2014-05-02 07:14:56

标签: java jsp url character-encoding

我正在尝试读取一个投掷字符串的网址。我将该字符串存储在某个变量中,并尝试使用jsp在我的网页上打印该变量。当我在我的网页上打印我的字符串时,它会给出一些垃圾字符。我怎样才能得到原始字符串?

这是我的jsp代码:

Market.jsp

<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>

<%

    URL url;
    ArrayList<String> list1 = new ArrayList<String>();
    ArrayList<String> list2 = new ArrayList<String>();
    List commodity1 = null;
    List price1 = null;
    int c, p = 0;
    try {
        // get URL content

        String a = "http://122.160.81.37:8080/mandim/MarketWise?m=agra";
        url = new URL(a);
        URLConnection conn = url.openConnection();
        // open the stream and put it into BufferedReader
        BufferedReader br = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));

        StringBuffer sb = new StringBuffer();
        String inputLine;
        while ((inputLine = br.readLine()) != null) {
            System.out.println(inputLine);
            //  sb.append(inputLine);
            String s = inputLine.replace("|", "\n");
            s = s.replace("~", " ");
            StringTokenizer str = new StringTokenizer(s);
            while (str.hasMoreTokens())
            {
                String mandi = str.nextElement().toString();
                String price = str.nextElement().toString();
                list1.add(mandi);
                list2.add(price);
            }
        }
        commodity1 = list1.subList(0, 10);

        // commodity10=list1.subList(90,100);
        price1 = list2.subList(0, 10);

        int c1 = 0;
        int p1 = 0;
        for (c1 = 0, p1 = 0; c1 < commodity1.size() && p1 < price1.size(); c1++, p1++) {
            String x = (String) commodity1.get(c1);
            String y = (String) price1.get(p1);
            out.println(x);
            out.println(y);
        }

        br.close();

        //System.out.println(sb);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
%>


</body>
</html>

我收到以下输出

धान 1325 चावल 2050 ज�वर 920 जौ 810 मकई 1280 गेहू� 1420 जो 1050 बेजर - जय 800 उड़द 3600

我怎样才能达到预期的目标?

提前致谢

1 个答案:

答案 0 :(得分:0)

我认为这是您系统上的编码问题。我不知道JSP足以告诉你什么,但是当你在linux上运行代码作为纯java应用程序并将out.println();更改为System.out.println();时,我可以看到输出符合预期。 (侧节点:产品名称是亚洲名称,所以不要像我一样惊讶。在这种情况下,预期字符与我对URL进行wget调用时的字符相同)。

这意味着:您的代码很好:它可以加载您想要的内容。问题是演示文稿。 HTML页面有自己的编码。我猜JSP是透明的( - &gt;这里我需要外部输入如何做到这一点),但结果必须有这三个解决方案中的一个:

  • 您的网页采用西方编码,无法支持亚洲字符。在这种情况下,您的字符串需要按照以下方式进行编码:&#8472;&#x2118;
  • 您的网页是utf8或unicode编码并直接支持此字符
  • 即使在utf8编码页面上,您也可以使用第一个示例中的编码

无论您选择使用什么:您的输出必须与格式匹配。这也意味着您的代码需要知道所选的字符集。而且我确信JSP确实如此。如果要使用默认实现的编码,则需要为此找到一个函数。看看Escape all strings in JSP/Spring MVC。这不会太难。

只有当你真的疯了但不知道怎么做时,请使用类似的东西(这是一个黑客!)函数来编码你的字符串:

private String encode(String str) {
    StringBuilder sb = new StringBuilder();
    for (char ch : str.toCharArray())
        if (ch < 128)
            sb.append(ch);
        else {
            sb.append("&#x");
            String hx = Integer.toHexString(ch);
            while (hx.length() < 4)
                hx = "0" + hx;
            sb.append(hx);
            sb.append(";");
        }
    return sb.toString();
}