首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中http响应的字符集

Java中http响应的字符集
EN

Stack Overflow用户
提问于 2022-09-24 19:14:18
回答 2查看 126关注 0票数 1

使用标准Java客户端,我在以下地址加载一个页面:https://www.youtube.com/watch?v=ELArlE7gSmw

这段youtube视频的标题是保加利亚语。它在页面的元标记中列出如下所示:

代码语言:javascript
复制
<meta name="title" content="here is title">

我正在使用下面的代码加载此页面。注意编码(Windows-1251):

代码语言:javascript
复制
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编码),则如下所示:

代码语言:javascript
复制
<meta name="title" content="ЗАХАРОСАН�? ЧЕРВЕН�? ЯБЪЛК�?!!">

如果您使用的是UTF-8而不是Windows1251,则如下所示:

代码语言:javascript
复制
<meta name="title" content="���������� ������� ������!!">

我还尝试过其他http客户端,例如jsoup库中的客户端。结果相似,尽管这个库的演示版本正确地显示了带有保加利亚内容的所有标记:

如何在没有错误的情况下解码http响应?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-24 21:59:51

解决了问题。

对于Intellij的想法:文件>设置>编辑器>文件编码。

将字段“全局编码”和“项目编码”设置为“系统默认”(不是UTF-8或Windows1251,而是默认的!)。整个输出是固定的

票数 0
EN

Stack Overflow用户

发布于 2022-09-24 20:32:41

有多个项可以(也不必)定义响应格式:

  • 当客户端发送请求时,有一个名为Accept-Encoding的头。这应该是客户端想要的服务器的提示。
  • 当服务器发送响应时,服务器应该标记头Content-Encoding中使用的编码。
  • 正如您提到的,响应体可能包含元标记。这里的缺点是客户端已经需要进行一些编码才能访问这些数据,因此不太可靠。
  • 不过,不管实际使用的编码是什么,您似乎都将BodyHandler应用于Windows-1251

这样,您的设置看起来非常脆弱,您最好检查标题是否接受-编码和内容编码是否存在和有意义。

编辑:在测试来自问题的代码时,我能够重现所报告的问题。但当我简单地利用客户端的默认行为时,它们就消失了:

代码语言:javascript
复制
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());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73839959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档