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

如何正确解码Java HTTP响应中的保加利亚语内容?

解决YouTube页面保加利亚语内容解码乱码问题

核心问题是没有正确识别响应的实际编码——YouTube的页面编码并非固定值,不能硬编码Windows-1251或UTF-8,需根据响应头或页面meta标签动态判断。以下是具体解决方法:

一、标准Java HTTP Client 正确解码步骤

不要手动指定编码,先获取原始字节流,再从响应头提取编码信息:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.youtube.com/watch?v=ELArlE7gSmw"))
        .header("Accept-Charset", "utf-8") // 优先请求UTF-8编码
        .build();

// 获取原始字节响应,避免提前错误解码
HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
String contentType = response.headers().firstValue("Content-Type").orElse("");

// 从Content-Type头中提取编码,无指定则默认UTF-8
Charset charset = contentType.contains("charset=") 
        ? Charset.forName(contentType.split("charset=")[1].trim()) 
        : StandardCharsets.UTF_8;

// 用正确编码解析字节流
String html = new String(response.body(), charset);
// 后续解析meta标签获取标题即可

如果响应头未明确编码,还需解析HTML中的<meta charset="xxx">或<meta http-equiv="Content-Type" content="text/html; charset=xxx">标签来确定编码。

二、Jsoup 正确解码方式

Jsoup在线Demo能正常显示,是因为它默认会自动检测编码。本地代码出错大概率是手动指定了错误编码,只需让Jsoup自动处理:

// 直接让Jsoup处理编码检测,不要手动设置.charset()
Document doc = Jsoup.connect("https://www.youtube.com/watch?v=ELArlE7gSmw")
        .header("Accept-Charset", "utf-8")
        .get();

// 提取视频标题
String videoTitle = doc.select("meta[property=og:title]").first().attr("content");
System.out.println(videoTitle);

若仍有问题,可先获取原始字节流再交给Jsoup解析:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.youtube.com/watch?v=ELArlE7gSmw"))
        .header("Accept-Charset", "utf-8")
        .build();
HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());

// 让Jsoup从字节流自动检测编码
Document doc = Jsoup.parse(new ByteArrayInputStream(response.body()), null, "https://www.youtube.com");
String videoTitle = doc.select("meta[property=og:title]").first().attr("content");
System.out.println(videoTitle);

三、关键注意事项

  • 永远不要硬编码编码值,动态检测是解决多语言乱码的通用方案;
  • 请求头添加Accept-Charset: utf-8,可引导服务器优先返回UTF-8编码的响应,减少编码识别成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:10:49