【问题标题】:Decoding multiple encoded string解码多个编码字符串
【发布时间】:2017-06-05 18:48:57
【问题描述】:

如何解码得到下面的结果?

/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;。

我不知道怎么把\u0026变成&,所以我可以改&到&。

【问题讨论】:

  • 如果您找到了问题的答案,那么您应该将其发布为答案,而不是作为问题的编辑。

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


【解决方案1】:

以这种方式对这些字符串进行双重(实际上是三重)编码表明该字符串未正确编码。如果您拥有对这些字符串进行编码的代码,请考虑在此处解决此问题,这是问题的根源。

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

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 除外,这是它们的正确编码值。

【讨论】:

  • 因为它不是 Web 应用程序 [msdn.microsoft.com/de-de/library/7c5fyk1k(v=vs.110).aspx](MSDN) 说要使用 System.Net.WebUtility.HtmlDecode(string)。可悲的是它导致/browse_ajax?action_continuation=1\u0026amp;continuation=4qmFsgJAEhhVQ2ZXdHFQeUJNR183aTMzT2VlTnNaWncaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA=%3
  • 遗憾的是,我不负责修复该编码,因为这是实际的 youtube 代码。也许new System.Net.WebClient().DownloadString(string) 在下载时会做奇怪的编码?
  • 所提供的网址经过了三遍编码。我不知道是你做的还是 YouTube 做的。您是否将 YouTube 提供给您的文字字符串作为 URI 加载?如果是这样,请发布处理接收 YouTube 响应消息、提取 URI 并将 URI 作为 Uri 对象加载的代码。
  • @Kartoffel - 请不要使用new System.Net.WebClient().DownloadString(string),因为System.Net.WebClient 是IDisposable,应在使用后丢弃。
【解决方案2】:

对我来说这个谜团似乎已经解决了,但是我再次偶然发现它,没有找到任何内置解决方案,因为如果字符是 html 转义字符的一部分,这些似乎无法解码 utf8。

由于这些似乎只使用与号,我必须使用Replace(@"\u0026","&") 才能HtmlDecode 并获得正确的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-06-17
    • 2014-12-31
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多