我的情景是:
我正在保存以utf-8编码的.eml文件。我写的文字的一个例子是:
有一些特殊字符,如âçç。这是葡萄牙人的角色。 当我用notepad ++打开文件时,文本显示如下:
如果我再次在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/
感谢。
答案 0 :(得分:1)
知道这个问题是可打印的,我在这里找到了一个很好的解码器:
http://www.dpit.co.uk/2011/09/decoding-quoted-printable-email-in-c.html
这适合我。
谢谢大家。
<强>更新强> 上面的链接已经死了,这是一个可行的应用程序:
答案 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.