1

したがって、この入力文字列を指定すると、次のようになります。

=?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;
                }
            });
        }

そして、それはただ下線を残します。それらを手動でスペースに変換しますか(Replace( "_"、 ""))、またはそれを処理するために他に何かする必要がありますか?

4

2 に答える 2

3

入力行の形式がよくわからないようです。ここで確認してください:http ://www.ietf.org/rfc/rfc2047.txt 形式は次のとおりです。 encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

だからあなたはしなければならない

  1. 余分な文字セット(.netでエンコード)。UTF8またはデフォルト(Utf16)だけではありません
  2. エンコードの抽出:base64の場合はB、quoted-printableの場合はQ(あなたの場合!)
  3. 次に、バイト、次に文字列へのデコードを実行します
于 2010-04-05T15:27:23.943 に答える
2
  1. この関数は、 quoted-printableでエンコードされたもの(16進コードとアンダースコア)をデコードしようとさえしていません。それを追加する必要があります。
  2. エンコーディングの処理が間違っています(UTF-8はEncoding.ASCII奇妙な理由でデコードされます)
于 2010-04-05T15:21:05.643 に答える