我正在使用 HttpClient 将发布请求发送到我无法控制的远程服务器,并尝试获取如下响应
HttpResponseArgs result = //Make the request with HttpClient object ( I am skipping it here)
var stringResult = result?.Content.ReadAsStringAsync().Result; // exception thrown here as "UTF-8" is not supported encoding name
在调试时,我发现远程服务器响应的 Content-Type 标头设置为 "text/xml; charset ="UTF-8"" 请注意 UTF-8 之间的额外“”,如果我这样做,这会导致错误从响应中删除标头,并添加一个新的内容类型标头,其中包含 "text/xml; charset =UTF-8"。请注意,我删除了代码中 UTF-8 周围的额外引号
result?.Content.ReadAsStringAsync().Result; // works fine now
请建议我能做什么?我觉得它是 .net 框架中的一个错误,因为邮递员可以以正确的方式解释远程服务器的响应。
问题出在响应标头中 UTF-8 周围的双引号中
您可以使用自定义 EncodingProvider
public class Utf8EncodingProvider : EncodingProvider
{
public override Encoding GetEncoding(string name)
{
return name == "\"UTF-8\"" ? Encoding.UTF8 : null;
}
public override Encoding GetEncoding(int codepage)
{
return null;
}
public static void Register()
{
Encoding.RegisterProvider(new Utf8EncodingProvider());
}
}
根据您的问题代码使用:
Utf8EncodingProvider.Register(); //You should call it once at startup of your application
HttpResponseArgs result = //Make the request with HttpClient object ( I am skipping it here)
var stringResult = result?.Content.ReadAsStringAsync().Result; // Must be executed without exception.
也许在原始字节上强制使用 UTF-8, 像这个
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
有许多 ASCII 不兼容的编码被广泛使用,特别是在亚洲国家(在 Unicode 兴起之前必须设计自己的解决方案)以及在 Windows、Java 和 .NET CLR 等平台上,其中许多 API 接受文本为 UTF -16 编码数据。
你可以...
将其作为文件对象传递给python,使用编码模块来回更改它。这项技术使 Python 成为 C++ 人员的“粘合剂”语言。
再一次,只是我的意见。
但我强烈建议你接受Georgy Tarasovs的回答
@Georgy Tarasov 的修改对我来说是必要的,因为 utf8 页面不断失败,因为它发送了轻微的变化。
public class Utf8EncodingProvider : EncodingProvider
{
private static readonly HashSet<string> Utf8Encoders = new HashSet<string>(
new string[] { "utf-8", "utf8", "\"UTF-8\"" }
);
public override Encoding GetEncoding(string name)
{
if (Utf8Encoders.Contains(name))
{
return Encoding.UTF8;
}
return null;
}
public override Encoding GetEncoding(int codepage)
{
return null;
}
public static void Register()
{
Encoding.RegisterProvider(new Utf8EncodingProvider());
}
}
别忘了打电话
Utf8EncodingProvider.Register();
可以转换
name.toLower()
以获得更多点击量