"UTF-8" is not supported encoding name 如何解决
How to solve "UTF-8" is not supported encoding name
我正在使用 HttpClient 向我无法控制的远程服务器发送 post 请求并尝试获得如下响应
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 header 响应设置为 "text/xml; charset ="UTF-8"" 请注意,如果我从响应中删除 header 并使用 放置新的 content-Type header,UTF-8 之间的额外“”会导致错误” text/xml;字符集=UTF-8。请注意我删除了围绕 UTF-8 代码的额外引号
result?.Content.ReadAsStringAsync().Result; // works fine now
请建议我能做什么?我觉得它是 .net 框架中的一个错误,因为 postman 可以正确地解释远程服务器的响应。
问题出在响应 header 中围绕 UTF-8 的双引号
也许对原始字节强制使用 UTF-8,
像 this
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
您可以使用自定义 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.
有许多广泛使用的 ASCII 不兼容编码,特别是在亚洲国家(在 Unicode 兴起之前必须设计自己的解决方案)和 Windows、Java 和.NET CLR,其中许多 API 接受文本作为 UTF-16 编码数据。
你可以...
将其作为文件对象传递给python,使用编码模块来回更改它。这项技术已确保 python 作为 C++ 用户的“胶水”语言。
再一次,只是我的意见。
但我强烈建议您接受 Georgy Tarasovs 的回答
我正在使用 HttpClient 向我无法控制的远程服务器发送 post 请求并尝试获得如下响应
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 header 响应设置为 "text/xml; charset ="UTF-8"" 请注意,如果我从响应中删除 header 并使用 放置新的 content-Type header,UTF-8 之间的额外“”会导致错误” text/xml;字符集=UTF-8。请注意我删除了围绕 UTF-8 代码的额外引号
result?.Content.ReadAsStringAsync().Result; // works fine now
请建议我能做什么?我觉得它是 .net 框架中的一个错误,因为 postman 可以正确地解释远程服务器的响应。
问题出在响应 header 中围绕 UTF-8 的双引号
也许对原始字节强制使用 UTF-8, 像 this
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
您可以使用自定义 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.
有许多广泛使用的 ASCII 不兼容编码,特别是在亚洲国家(在 Unicode 兴起之前必须设计自己的解决方案)和 Windows、Java 和.NET CLR,其中许多 API 接受文本作为 UTF-16 编码数据。
你可以...
将其作为文件对象传递给python,使用编码模块来回更改它。这项技术已确保 python 作为 C++ 用户的“胶水”语言。
再一次,只是我的意见。
但我强烈建议您接受 Georgy Tarasovs 的回答