C# 为什么这个UTF-16 HTTP响应在结果流中最终成为UTF-8?

C# 为什么这个UTF-16 HTTP响应在结果流中最终成为UTF-8?,c#,encoding,http-headers,content-type,asp.net-core-3.1,C#,Encoding,Http Headers,Content Type,Asp.net Core 3.1,我遇到服务返回HTTP头的问题: Content-Type: application/json; charset=utf-16 当它被C#序列化时,它会以UTF-8流结束,这显然会中断。utf-16似乎是一种有效的编码方式。那么为什么这个代码不起作用呢 System.Net.Http.HttpClient-HttpClient。。。; 使用(var response=wait-httpClient.sendsync(请求,HttpCompletionOption.ResponseHeaders

我遇到服务返回HTTP头的问题:

Content-Type: application/json; charset=utf-16
当它被C#序列化时,它会以UTF-8流结束,这显然会中断。utf-16似乎是一种有效的编码方式。那么为什么这个代码不起作用呢

System.Net.Http.HttpClient-HttpClient。。。;
使用(var response=wait-httpClient.sendsync(请求,HttpCompletionOption.ResponseHeadersRead))
{
//response.Content.Headers.ContentType.CharSet=“utf-16”
使用(var responseContentStream=await response.Content.ReadAsStreamAsync())
{
使用(var streamReader=新streamReader(stream))
{
//streamReader.CurrentEncoding.BodyName在这里返回utf-8?!
}
}
} 

因此,最初的
响应
似乎很好,但一旦到达
streamReader
时,它似乎又恢复到utf-8。为什么?

您可以指定StreamReader应该在构造函数中使用的编码。 在您的情况下,它应该如下所示:

using (var streamReader = new StreamReader(stream, Encoding.Unicode, true))
{
  // The reader should read the Stream with UTF-16 here
}

您似乎希望
StreamReader
(它将单个字节转换为字符串)单独从流中确定编码。如果内容足够小,请使用
response.content.ReadAsStringAsync()
——它具有使用正确编码的智能。如果您使用
StreamReader
,您只是给它一个
Stream
,没有关于客户端和服务器连接时要使用的编码的信息。在协商过程中,服务器上的网页标题和请求中的标题用于确定通用操作模式。在某些情况下,服务器会忽略客户端标头,而在其他情况下,服务器会支持客户端标头中的模式。例如,服务器可能同时支持英语和法语。因此,服务器使用来自客户端的标题来确定正确语言的主页。每台服务器都是不同的。那么您是否在请求中包含了字符集。在某些情况下,语言决定编码。当您使用
ReadAsStringAsync()
时,HttpContent用于确定响应的编码。如果使用
ReadAsStreamAsync()
,那么当然不会运行任何代码。@Liam流只是字节的集合,仅此而已。没有编码的概念,因为任何旧的任意流可能甚至不代表文本!这不是我真正想要的,这可能返回utf-8或utf-16。我想知道的是,为什么StreamReader不尊重HTTP中的编码response@Liam因为StreamReader对HTTP响应一无所知。你什么都没说!你给它的只是一个bytes@Liam如果未指定其他编码,则StreamReader默认使用UTF-8。但是你可以从响应头读取编码,然后切换读卡器编码,这很好,我只是说我不想知道如何解决这个问题,我想知道为什么会发生这种情况