如何正确地将 ISO-8859-1 转换为 UTF8?

3

我需要将响应流写入文件。该流包含一个编码页面(iso-8859-1)。

这是我的代码:

...

using (TextWriter writer = new StreamWriter(tmpFilePath))
{
  using (TextReader reader = new StreamReader(answer, Encoding.GetEncoding("ISO-8859-1")))
  {

    string line = "";
    while ((line = reader.ReadLine()) != null) 
    {

      // try to decode
      string decoded_line = decode(line);

      writer.WriteLine(decoded_line);
    }

  }

}

...


string decode(string message) 
{
  string result = "";

  Encoding iso = Encoding.GetEncoding("iso-8859-1");
  Encoding utf8 = Encoding.UTF8;

  byte[] isoBytes = iso.GetBytes(message);
  byte[] utf8Bytes = Encoding.Convert(iso, utf8, isoBytes);

  result = utf8.GetString(utf8Bytes);

  return result;
}

问题在于decode()无法正常工作。
如何正确地将iso-8859-1转换为utf8?
更新:
我依赖于fiddler来获取内容类型。

"message"的内容看起来不像是有效的ISO-8859-1编码。 - H H
删除您的decode()方法,解码和编码已经由StreamReader/Writer处理。如果仍然有问题,则表示您没有正确猜测输入文件的编码方式。 - Hans Passant
3个回答

3
鉴于情况,以下操作应该足够了:
using (TextWriter writer = new StreamWriter(tmpFilePath, Ecoding.UTF8))
{
 using (TextReader reader = new StreamReader(answer, Encoding.GetEncoding("ISO-8859-1")))
 {
   while ((line = reader.ReadLine()) != null) 
   {
      writer.WriteLine(decoded_line);
   }
 }    
}

如果这个方法不起作用,检查一下你的数据。在调试器中,第一行看起来怎么样?

1
你正在解码两次 - 你在创建StreamReader时已经指定了编码方式。结果字符串应该已经被正确解码。
这并不能解释为什么`message`看起来像那样 - 它应该看起来像一个普通的字符串。你确定你读取的文件包含你认为它包含的内容吗?

-1

您可以查看示例.NET转换代码,将任何编码转换为任何编码,并在Azure Function中按原样工作,但可能可以重新托管在任何.NET可运行的地方:

https://learn.microsoft.com/en-us/archive/blogs/david_burgs_blog/support-non-utf-payloads-in-logic-app-with-a-conversion-azure-function

这个示例将输入和输出内容保护在base64编码中,以确保.NET字符串类型的unicode假设不会妨碍。

 var outputBytes = Encoding.Convert(srcEncoding: inputEncoding, dstEncoding: encodingOutput, bytes: Convert.FromBase64String(input));
...
text = Convert.ToBase64String(outputBytes)

字节数组也可以直接读写文件句柄。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接