1

我的情况是:

  • 在 Outlook Express 中创建电子邮件并将其保存为 .eml 文件;
  • 在 C# 控制台应用程序中将文件作为字符串读取;

我正在保存以 utf-8 编码的 .eml 文件。我写的一个例子是:

  1. 'Goiâniaé badalação'。

有像âéçã这样的特殊字符。它是葡萄牙语字符。当我用记事本++打开文件时,文本显示如下:

  1. 'Goi=C3=A2nia =C3=A9 badala=C3=A7=C3=A3o.'

如果我再次在outook express打开它,它显示正常,就像第一种方式一样。当我在控制台应用程序中读取文件时,使用 utf-8 解码,字符串显示为第二种方式。

我使用的代码是:

string text = File.ReadAllText(@"C:\fromOutlook.eml", Encoding.UTF8);
Console.WriteLine(text);

我尝试了所有的编码选项和很多我在网上找到的方法,但没有任何效果。有人可以帮我做这个简单的转换吗?

'Goi=C3=A2nia =C3=A9 badala=C3=A7=C3=A3o.' 到“Goiânia é badalação”。

    string text = "Goi=C3=A2nia =C3=A9 badala=C3=A7=C3=A3o.";

    byte[] bytes = new byte[text.Length * sizeof(char)];
    System.Buffer.BlockCopy(text.ToCharArray(), 0, bytes, 0, bytes.Encoding.UTF8.GetString(bytes, 0, bytes.Length);

    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    Console.WriteLine(new string(chars));

在这个 utf-8 表中,您可以看到十六进制。这些字符的值,'é' == 'c3 a9': http ://www.utf8-chartable.de/

谢谢。

4

2 回答 2

1
var input = "Goi=C3=A2nia =C3=A9 badala=C3=A7=C3=A3o.";             
var buffer = new List<byte>();
var i = 0;
while(i < input.Length)
{
    var character = input[i];
    if(character == '=')
    {
        var part = input.Substring(i+1,2);
        buffer.Add(byte.Parse(part, System.Globalization.NumberStyles.HexNumber));
        i+=3;
    }
    else
    {
        buffer.Add((byte)character);
        i++;
    }
};
var output = Encoding.UTF8.GetString(buffer.ToArray());
Console.WriteLine(output); // prints: Goiânia é badalação.
于 2013-02-15T12:36:28.587 回答
1

知道问题是引用可打印的,我在这里找到了一个很好的解码器:

http://www.dpit.co.uk/2011/09/decoding-quoted-printable-email-in-c.html

这对我有用。

谢谢各位。

更新: 上面的链接已经失效,这是一个可行的应用程序:

如何转换引用打印字符串

于 2013-02-15T13:42:04.663 回答