繁体   English   中英

从InputStreamReader提取文本在UTF-8中不起作用

[英]Extracting text from InputStreamReader not working in UTF-8

我正在尝试阅读以下API文本页面:

https://api.stackexchange.com/2.2/users?page=1&pagesize=9&fromdate=1221436800&todate=1523318400&order=desc&min=1&max=2000000&sort=reputation&site=stackoverflow

使用InputStreamReader,我想提取文本并逐行打印。

问题是文本格式未被识别为UTF-8。 所以输出看起来很丑:

该方法的代码如下:

String testURL = "https://api.stackexchange.com/2.2/users?page=1&pagesize=9&fromdate=1221436800&todate=1523318400&order=desc&min=1&max=2000000&sort=reputation&site=stackoverflow";

            URL url = null;
            try
            {
                url = new URL(testURL);
            } catch (MalformedURLException e1)
            {
                e1.printStackTrace();
            }

            InputStream is = null;

            try
            {
                is = url.openStream();
            } catch (IOException e1)
            {
                e1.printStackTrace();
            }


            try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")))
            {
                String line;

                while ((line = br.readLine()) != null)
                {
                    System.out.println(line);
                }

            } catch (MalformedURLException e)
            {
                e.printStackTrace();

            } catch (IOException e)
            {
                e.printStackTrace();

            }

我试过换线

try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")))

try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)))

或者

try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")))

不幸的是,问题仍然存在。 我真的很感谢任何提示,以便我可以解决此问题。 谢谢。

为了分析您的问题,我尝试通过curl从给定的URL下载(带有-i选项以查看HTTP响应标题行),并得到:

Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Credentials: false
X-Content-Type-Options: nosniff
Date: Sat, 21 Apr 2018 21:48:42 GMT
Content-Length: 85

▒VJ-*▒/▒▒LQ▒210ЁrsS▒▒▒S▒▒▒▒3KR2▒▒R
 K3▒RS▒`J▒sA▒I▒)▒▒E@NIj▒R-g▒▒PP^C

Content-Encoding: gzip告诉您内容是gzip压缩的。

因此,在Java程序中,您需要gzip解压缩内容。
您只需替换行即可

is = url.openStream();

is = new GZIPInputStream(url.openStream());

更好的方法是获取实际的Content-Encoding,并根据此决定是否解压缩内容:

URLConnection connection = url.openConnection();
is = connection.getInputStream();
String contentEncoding = connection.getContentEncoding();
if (contentEncoding.equals("gzip"))
    is = new GZIPInputStream(is);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM