c# - 解码引用可打印正确

标签 c# .net

我有以下字符串:

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt=...

这是一个编码

[proconact-Verbesserung #279] (Neu) Stellvertretungen Benutzerrecht - andere können für andere Stellvertretungen erstellen ändern usw. dadurch ist der Schutz der Aktiviäten Mails nicht gewährt.

我正在寻找一种方法来解码引用的字符串。

我试过:

private static string DecodeQuotedPrintables(string input, string charSet) {
    Encoding enc = new ASCIIEncoding();
    try {
        enc = Encoding.GetEncoding(charSet);
    } catch {
        enc = new UTF8Encoding();
    }

    var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline);
    var matches = occurences.Matches(input);

    foreach (Match match in matches) {
        try {
            byte[] b = new byte[match.Groups[0].Value.Length / 3];
            for (int i = 0; i < match.Groups[0].Value.Length / 3; i++) {
                b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
            }
            char[] hexChar = enc.GetChars(b);
            input = input.Replace(match.Groups[0].Value, hexChar[0].ToString());
        } catch { ;}
    }
    input = input.Replace("?=", "").Replace("=\r\n", "");

    return input;
}

当我调用时(其中 s 是我的字符串)

var x = DecodeQuotedPrintables(s, "utf-8");

这将返回

=?utf-8?Q?[proconact_-_Verbesserung_#_(Neu)_Stellvertretungen_Benutzerrecht_-_andere_können_für_andere_Stellvertretungen_erstellen_ändern_usw._dadurch_ist_der_Schutz_der_Aktiviäten_Mails_nicht_gewährt=...

我该怎么做,还有 _ 和开始的 =?utf-8?Q? 以及尾随的 =.. 被删除?

最佳答案

您尝试解码的文本通常位于 MIME header 中,并根据以下 Internet 标准中定义的规范进行编码:RFC 2047: MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text .

GitHub 上有此类解码器的示例实现;也许你可以从中得出一些想法:RFC2047 decoder in C# .

您还可以使用此在线工具比较您的结果:Online MIME Headers Decoder .

请注意,您的示例文本不正确。规范声明:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

根据规范,任何编码字必须?= 结尾。因此,您的样本必须从以下方面进行更正:

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt=

…到(滚动到最右边):

=?utf-8?Q?=5Bproconact_=2D_Verbesserung_=23=32=37=39=5D_=28Neu=29_Stellvertretungen_Benutzerrecht_=2D_andere_k=C3=B6nnen_f=C3=BCr_andere_Stellvertretungen_erstellen_=C3=A4ndern_usw=2E_dadurch_ist_der_Schutz_der_Aktivi=C3=A4ten_Mails_nicht_gew=C3=A4hrt?=

严格来说,您的样本也是无效的,因为它超过了对任何编码词施加的 75 个字符的限制;然而,大多数解码器倾向于容忍这种不一致。

关于c# - 解码引用可打印正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10459964/

相关文章:

c# - Dispose、Finalize、SuppressFinalize 方法

c# - 请将 SQL 转换为 LINQ 或改进我的查询

c# - 为什么我可以在 C# 中实例化一个没有构造函数的类?

c# - 从 C# 中的字符串中删除最后一个字符。一种优雅的方式?

c# - Entity Framework 平均值,按查询分组

c# - 反序列化之前在序列化时包含值的空字段

c# - 如何获取 .m4v 格式电影的运行时间?

c# - 无效操作异常 : An exception was thrown while attempting to evaluate a LINQ query parameter expression

c# - 为什么 Struct 中属性的顺序会改变实例的大小?

c# - 搜索字符串以查找文件名