gpt4 book ai didi

java - 读取 InputStream 时忽略编码

转载 作者:行者123 更新时间:2023-12-01 12:28:17 29 4
gpt4 key购买 nike

我在向 IIS 服务器发出 HTTP 请求的 Java 应用程序中遇到一些编码问题。

迭代 URLConnection 对象的 header ,我可以看到以下(相关) header :

Transfer-Encoding: [chunked]
Content-Encoding: [utf-8]
Content-Type: [text/html; charset=utf-8]

URLConnection.getContentEncoding() 方法返回 utf-8 作为文档编码。

这就是我的 HTTP 请求和流读取的方式:

OutputStreamWriter sw = null;
BufferedReader br = null;
char[] buffer = null;
URL url;
url = new URL(this.URL);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
sw = new OutputStreamWriter(connection.getOutputStream());
sw.write(postData);
sw.flush();
br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF8"));
StringBuilder totalResponse = new StringBuilder();
String line;

while((line = br.readLine()) != null) {
totalResponse.append(line);
}
buffer = totalResponse.toString().toCharArray();
if (sw != null)
sw.close();

if (br != null)
br.close();

return buffer;

然而,服务器发送的以下字符串“ñáção”被客户端接收为“�����o”。

我做错了什么?

最佳答案

根据您的评论,您正在尝试从 IIS 服务器接收 FIX 消息,并且 FIX 使用 ASCII。只有一小部分标签支持其他编码,并且必须以特殊方式处理它们(标准 FIX 规范中的非 ASCII 标签为 349,351,353,355,357,359,361,363,365)。如果存在此类标签,您将获得一个标签 347,其值指定编码(例如 UTF-8),然后每个标签前面都会有一个标签,给出即将到来的编码值的长度(对于标签 349,你总是会首先得到 348 的整数值)

在您的情况下,服务器似乎正在以其他编码发送自定义标记 10411(10xxx 范围)。按照惯例,前面的标签 10410 应该给出 10411 中值的长度,但它包含“0000”,这可能有其他含义。

请注意,尽管 FIX 消息非常可读,但它们仍应被视为二进制数据。标签和值大多是 ASCII 字符,但分隔符 (SOH) 是 0x01,并且如上所述,某些标签可以使用其他编码进行编码。 IIS 服务实际上应该以 application/octet-stream 形式返回数据,以便可以正确接收数据。尝试将其返回为 text/html 是自找麻烦:)。

关于java - 读取 InputStream 时忽略编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158169/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com