使用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
相关产品推荐
相关产品推荐

