【问题标题】:Read utf-8 url to string java读取 utf-8 url 到字符串 java
【发布时间】:2012-09-25 21:48:47
【问题描述】:

美好的一天。刚刚从objective-c切换到java并尝试将url内容正常读取为字符串。阅读大量帖子,但仍然会产生垃圾。

public class TableMain {

    /**
     * @param args
     */
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws Exception {
        URL url = null;
        URLConnection urlConn = null;

        try {
            url = new URL("http://svo.aero/timetable/today/");
        } catch (MalformedURLException err) {
            err.printStackTrace();
        }
        try {
            urlConn = url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    urlConn.getInputStream(), "UTF-8"));
            StringBuilder strB = new StringBuilder();
            String str;
            while (null != (str = input.readLine())) {
                strB.append(str).append("\r\n");
                System.out.println(str);
            }
            input.close();
        } catch (IOException err) {
            err.printStackTrace();
        }
    }
}

怎么了?我得到了这样的东西

??y??'??)j1???-?q?E?|V??,??zxxDx????t^???5? ??j?‌​?k??u?q?j6?^t?????????W??????????~?????????o6/ em>?|?8??{???O????0?M>Z{srs??K???XV??4Z‌​??'??n/??^??4?? ??w+?????e???????[?{/??,??WO????????????.?.?x???????^ ?rax??]?xb??‌​& ??8;?????}???h????H5????v?e?0?????-???? ?g?vN

【问题讨论】:

  • 请发布您得到的实际错误/输出。
  • 查看对this question 的回复。 This onethis one 对于您正在尝试做的事情特别有用。
  • 只是为了排除,您的默认字符集是否也设置为 UTF-8?您可以通过System.out.println(Charset.defaultCharset()); 进行检查
  • @SuppressWarnings("deprecation"),您应该使用已弃用的方法吗?
  • 抱歉非常愚蠢的问题,从哪里可以导入 IOUtils - 遇到这个话题之前仍然可以找到它。试过 import org.apache.commons.io.IOUtils.*;

标签: java string url utf-8


【解决方案1】:

这是一个使用HttpClient的方法:

 public HttpResponse getResponse(String url) throws IOException {
    httpClient.getParams().setParameter("http.protocol.content-charset", "UTF-8");
    return httpClient.execute(new HttpGet(url));
}


public String getSource(String url) throws IOException {
            StringBuilder sb = new StringBuilder();
            HttpResponse response = getResponse(url);
            if (response.getEntity() == null) {
                throw new IOException("Response entity not set");
            }
            BufferedReader contentReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            String line = contentReader.readLine();

            while ( line != null ){
                sb.append(line)
                  .append(NEW_LINE);
                line = contentReader.readLine();
            }
            return sb.toString();
    }

编辑:我编辑了响应以确保它使用 utf-8。

【讨论】:

  • emm 抱歉,我没看到你在哪里输入编码?
  • 对于 utf-8 编码,调用 readLine 即可。您可以使用其他允许您指定编码的阅读器,但在您的问题中您没有指定任何有关编码的内容。
  • @baba 标题指定了UTF-8。
  • Anywho,那么你可以使用 DefaultHttpCLient。 hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…。如您所见,如果未配置,它使用 DEFAULT_CONTENT_CHARSET,但您可以配置它。
【解决方案2】:

这是由于:

  1. 您正在获取 UTF-8 编码的数据
  2. 您没有指定,但我猜您是在 Windows 系统上将其打印到控制台

数据被正确接收和存储,但是当您打印它时,目的地无法呈现俄语文本。除非最终的显示处理程序能够呈现所涉及的字符,否则您将无法仅将文本“打印”到标准输出。

【讨论】:

  • 我使用的是 Mac OS。我怎样才能让它打印正确?默认字符集是 x-MacCyrillic
  • 打印在哪里?在终端窗口中?可能可以为终端设置默认编码,但我不在Mac上工作,所以我不知道终端程序是否能够显示UTF-8,即使设置了编码。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2023-03-27
  • 2018-01-03
  • 2019-06-21
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多