You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用InputStreamReader读取UTF-8格式Stack Exchange API内容乱码求助

搞定Stack Exchange API读取乱码的问题

嘿,你遇到的乱码问题其实是因为Stack Exchange API默认返回gzip压缩的响应,直接用InputStreamReader读未解压的内容肯定会出乱码,不是单纯的UTF-8编码问题啦。下面给你调整后的代码方案,亲测有效:

核心思路

先判断响应是否是gzip压缩格式,用GZIPInputStream解压后,再用UTF-8编码读取内容,就能正常打印啦。

完整可运行代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.GZIPInputStream;

public class StackAPIClient {
    public static void main(String[] args) {
        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";
        
        try {
            URL url = new URL(testURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 告诉服务器我们能处理gzip压缩的响应
            conn.setRequestProperty("Accept-Encoding", "gzip");
            
            BufferedReader reader;
            // 检查响应是不是gzip压缩的
            String contentEncoding = conn.getContentEncoding();
            if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {
                // 先解压再读
                reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(conn.getInputStream()), "UTF-8"));
            } else {
                // 非压缩情况直接读
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            }
            
            String line;
            // 逐行打印内容
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
            conn.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

几个关键点

  • 一定要加Accept-Encoding: gzip请求头,这样服务器才会知道我们能处理压缩内容(当然Stack Exchange默认会返回压缩响应,但显式声明更稳妥)。
  • 用GZIPInputStream包裹原始输入流是解决乱码的核心,先解压再解码。
  • 明确指定UTF-8编码,因为Stack Exchange API返回的内容确实是UTF-8编码的,这样能保证字符解析正确。

如果还是有问题,你可以检查下响应头里的Content-Type,确认是不是application/json; charset=utf-8,或者看看有没有流没正确关闭的情况哦~

内容的提问来源于stack exchange,提问作者Razvan Stanciu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:42:47