解码多个编码的字符串

时间:2017-06-05 18:48:57

标签: c# html-escape-characters unicode-escapes string-decoding

如何对此进行解码以获得以下结果?

/browse_ajax?action_continuation=1\u0026amp;continuation=4qmFsgJAEhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA%253D%253D

/browse_ajax?action_continuation=1&continuation=4qmFsgJAEhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA%253D%253D

我已经尝试了这些,也多次使用它们,因为我读取字符串可能会多次编码。

System.Text.RegularExpressions.Regex.Unescape(string)
System.Uri.UnescapeDataString(string)
System.Net.WebUtility.UrlDecode(string)

这是正确的功能,或者更确切地说,我需要以什么顺序调用它们才能获得该结果。随着字符串的变化,集合中可能还有其他特殊字符,因此自行编辑变通方法有点过于冒险。

必须对字符串进行解码才能使用new System.Net.WebClient().DownloadString(string)

编辑:所以我发现上面的说法是错误的,我不需要解码它来使用WebClient.DownloadString(string) 。但是,下载的字符串也会遭受类似的编码。在下载之前将WebClient的编码属性设置为UTF8可以完成大部分工作,但是某些字符仍然看似已损坏,例如:双引号和&符号保持\u0026quot;\u0026amp;

我不知道怎么做&amp ;,所以我可以改变&放大器;到&。

2 个答案:

答案 0 :(得分:0)

这些字符串是以这种方式编码的两倍(实际上是三倍)是字符串未正确编码的标志。如果您拥有编码这些字符串的代码,请考虑在那里解决这个问题,这是问题的根源。

也就是说,这是解码时需要进行的解码调用。我不推荐这种解决方案,因为它绝对是一种解决方法。同样,有问题的行为是在进行编码的代码中。

string val = "/browse_ajax?action_continuation=1\u0026amp;continuation=4qmFsgJAEhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA%253D%253D";
val = System.Uri.UnescapeDataString(val);
val = System.Uri.UnescapeDataString(val);
val = System.Web.HttpUtility.HtmlDecode(val);

这会给你:

/browse_ajax?action_continuation=1&continuation=4qmFsgJAEhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA==

如果您真的想保留等号的%253D编码,只需拨打Uri.UnescapeData(string)一次即可。这将保留编码的等号,除了%3D,这是它们正确的编码值。

答案 1 :(得分:0)

看起来这个神秘的东西已经解决了,但是我再次偶然发现它,没有找到任何解决方案,因为如果角色是html转义字符的一部分,这些似乎无法解码utf8。

因为这些似乎只使用&符号,我必须使用HtmlDecode才能{{1}}并获得正确的字符串。