【发布时间】:2012-05-14 15:43:44
【问题描述】:
我有以下字符串:
=?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? 和结尾的 =.. 也会被删除?
【问题讨论】:
-
这是邪恶的:
try { ... } catch { ;} -
你最终应该得到什么?您要从原始字符串中取出的最后一个字符串是什么?
-
这是我应该得到的原始字符串:[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.
-
附注:您的源字符串看起来像一个 *** 的 url 编码字符串,如果它没有被替换为 url 编码的实体(如
%23),它可以很容易地被解码与_=23_。如果您无法控制源字符串,可能会取消替换源字符串并进行 url 解码,这将大大简化您的方法。 -
@Filburt:源字符串是有效的(几乎)RFC 2047 编码字;请参阅下面的答案。