无法使用 UTF8 编码转换 HttpResponseMessage

Posted

技术标签:

【中文标题】无法使用 UTF8 编码转换 HttpResponseMessage【英文标题】:Can't convert HttpResponseMessage with UTF8 encoding 【发布时间】:2016-02-07 09:17:01 【问题描述】:

我正在为通常的转换问题而苦苦挣扎,但不幸的是,我找不到任何适合我的具体问题的东西。

我的应用正在接收来自 php 服务器的 System.Net.Http.HttpResponseMessage,UTF8 编码,包含一些字符,如 \u00c3\u00a0 (à),但我无法转换它们。

string message = await result.Content.ReadAsStringAsync();
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
string newmessage = Encoding.UTF8.GetString(messageBytes, 0, messageBytes.Length);

这只是我的尝试之一,但没有任何反应,生成的字符串仍然有 \u00c3\u00a0 字符。

我还阅读了一些答案,例如How to convert a UTF-8 string into Unicode?,但这个解决方案对我不起作用。这是解决方案代码:

public static string DecodeFromUtf8(this string utf8String)

   // copy the string as UTF-8 bytes.
   byte[] utf8Bytes = new byte[utf8String.Length];
   for (int i=0;i<utf8String.Length;++i) 
      //Debug.Assert( 0 <= utf8String[i] && utf8String[i] <= 255, "the char must be in byte's range");
      utf8Bytes[i] = (byte)utf8String[i];
   

   return Encoding.UTF8.GetString(utf8Bytes,0,utf8Bytes.Length);


DecodeFromUtf8("d\u00C3\u00A9j\u00C3\u00A0"); // déjà

我注意到,当我使用像

这样的简单字符串尝试上述解决方案时
string str = "Comunit\u00c3\u00a0"

DecodeFromUtf8 方法完美运行,问题是当我使用我的响应消息时。

任何建议将不胜感激

【问题讨论】:

为什么不使用“newmessage”来连接变量“message”中的原始消息? 如果你指的是我删除的调试行,那是一个错字 【参考方案1】:

我自己解决了这个问题。我发现服务器响应是 utf-8 json 的 ISO 字符串,所以我必须删除 json 转义字符,然后将 iso 转换为 utf8

所以我必须做以下事情:

private async Task<string> ResponseMessageAsync(HttpResponseMessage result)

    string message = await result.Content.ReadAsStringAsync();
    string parsedString = Regex.Unescape(message);
    byte[] isoBites = Encoding.GetEncoding("ISO-8859-1").GetBytes(parsedString);
    return Encoding.UTF8.GetString(isoBites, 0, isoBites.Length);
 

【讨论】:

我遇到了类似的问题。供应商说内容是 UTF-8 并且 content-type 标头说内容类型是 UTF-8 但我必须使用“ISO-8859-1”编码来读取响应内容我得到了正确的字符返回。跨度> 在我的情况下实际起作用的是读取 iso 字节并获取 UTF8 字符串,而无需实际调用 Encoding.Convert 这正是我想要的,谢谢!【参考方案2】:

对我来说,作品的变化来自:

string message = await result.Content.ReadAsStringAsync();
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
string newmessage = Encoding.UTF8.GetString(messageBytes, 0, messageBytes.Length);

到:

byte[] bytes = await result.Content.ReadAsByteArrayAsync();
Encoding utf8 = Encoding.UTF8;
string newmessage = utf8.GetString(bytes);

【讨论】:

以上是关于无法使用 UTF8 编码转换 HttpResponseMessage的主要内容,如果未能解决你的问题,请参考以下文章

怎么转换为utf8有BOM编码

nroff / groff无法正确转换utf-8编码文件

怎样把UTF8编码转成GB2312编码?

如何使用C语言将汉字转换成UTF8编码,如将“你好”转成:%E4%BD%A0%E5%A5%

将NSString转换成UTF8编码的NSString

oracle编码gbk加载utf-8文件需要转码么?