使用标准Java客户端,我在以下地址加载一个页面:https://www.youtube.com/watch?v=ELArlE7gSmw
这段youtube视频的标题是保加利亚语。它在页面的元标记中列出如下所示:
<meta name="title" content="here is title">我正在使用下面的代码加载此页面。注意编码(Windows-1251):
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
public class Application {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://www.youtube.com/watch?v=ELArlE7gSmw"))
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString(Charset.forName("Windows-1251")));
System.out.println(response.body());
}
}如果您在响应中查看此标记(使用Windows1251编码),则如下所示:
<meta name="title" content="ЗАХАРОСАН�? ЧЕРВЕН�? ЯБЪЛК�?!!">如果您使用的是UTF-8而不是Windows1251,则如下所示:
<meta name="title" content="���������� ������� ������!!">我还尝试过其他http客户端,例如jsoup库中的客户端。结果相似,尽管这个库的演示版本正确地显示了带有保加利亚内容的所有标记:

如何在没有错误的情况下解码http响应?
发布于 2022-09-24 21:59:51
解决了问题。
对于Intellij的想法:文件>设置>编辑器>文件编码。
将字段“全局编码”和“项目编码”设置为“系统默认”(不是UTF-8或Windows1251,而是默认的!)。整个输出是固定的

发布于 2022-09-24 20:32:41
有多个项可以(也不必)定义响应格式:
Accept-Encoding的头。这应该是客户端想要的服务器的提示。Content-Encoding中使用的编码。Windows-1251。这样,您的设置看起来非常脆弱,您最好检查标题是否接受-编码和内容编码是否存在和有意义。
编辑:在测试来自问题的代码时,我能够重现所报告的问题。但当我简单地利用客户端的默认行为时,它们就消失了:
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://www.youtube.com/watch?v=ELArlE7gSmw"))
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}https://stackoverflow.com/questions/73839959
复制相似问题