文本解码问题

时间:2010-04-05 15:13:56

标签: c# text-decoding

因此给出了这个输入字符串:

=?ISO-8859-1?Q?TEST=2C_This_Is_A_Test_of_Some_Encoding=AE?=

这个功能:

private string DecodeSubject(string input)
        {
            StringBuilder sb = new StringBuilder();
            MatchCollection matches = Regex.Matches(inputText.Text, @"=\?(?<encoding>[\S]+)\?.\?(?<data>[\S]+[=]*)\?=");
            foreach (Match m in matches)
            {
                string encoding = m.Groups["encoding"].Value;
                string data = m.Groups["data"].Value;

                Encoding enc = Encoding.GetEncoding(encoding.ToLower());
                if (enc == Encoding.UTF8)
                {
                    byte[] d = Convert.FromBase64String(data);
                    sb.Append(Encoding.ASCII.GetString(d));
                }
                else
                {                    
                    byte[] bytes = Encoding.Default.GetBytes(data);
                    string decoded = enc.GetString(bytes);
                    sb.Append(decoded);
                }
            }

            return sb.ToString();

        }

结果与从输入字符串中提取的数据相同。我的错误是这个文本没有被正确解码?

更新

所以我有这个代码用于解码quote-printable:

public string DecodeQuotedPrintable(string encoded)
        {
            byte[] buffer = new byte[1];
            return Regex.Replace(encoded, "=(\r\n?|\n)|=([A-F0-9]{2})", delegate(Match m)
            {
                if (byte.TryParse(m.Groups[2].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out buffer[0]))
                {
                    return Encoding.ASCII.GetString(buffer);
                }
                else
                {
                    return string.Empty;
                }
            });
        }

这只是留下了下划线。我会手动将它们转换为空格(替换(“_”,“”)),还是还需要做些什么来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

看起来你还没有完全理解输入行的格式。请在此处查看:http://www.ietf.org/rfc/rfc2047.txt 格式为:encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

所以你必须

  1. Extranct charset(以.net编码)。不只是UTF8或默认(Utf16)
  2. 提取编码:B表示base64 Q,用于quoted-printable(您的情况!)
  3. 然后执行解码为字节,然后执行字符串

答案 1 :(得分:2)

  1. 该函数甚至没有尝试解码quoted-printable编码的东西(十六进制代码和下划线)。你需要添加它。
  2. 它正在处理编码错误(UTF-8因某些奇怪的原因而被Encoding.ASCII解码)