如何在C#中读取utf-8编码的字符串?

时间:2013-02-15 12:00:50

标签: c# utf-8 character-encoding

我的情景是:

  • 在Outlook Express中创建一封电子邮件,并将其另存为.eml文件;
  • 在C#console应用程序中以字符串形式读取文件;

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

  1. 'Goiâniaébadalação。'
  2. 有一些特殊字符,如âçç。这是葡萄牙人的角色。 当我用notepad ++打开文件时,文本显示如下:

    1. 'Goi = C3 = A2nia = C3 = A9 badala = C3 = A7 = C3 = A3o。'
    2. 如果我再次在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/

      感谢。

2 个答案:

答案 0 :(得分:1)

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

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

这适合我。

谢谢大家。

<强>更新 上面的链接已经死了,这是一个可行的应用程序:

How to convert Quoted-Print String

答案 1 :(得分:0)

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.