为什么 Network.URI (parseURI) 不喜欢管道字符?

Why does Network.URI (parseURI) not like the pipe character?

我正在使用 network-uri package 中的 parseURI 函数来解析一些网址。其中一些 url 中有管道字符,解析失败。例如:

Network.URI> parseURI "http://something.com/foo|bar"
Nothing

但是,这些 url 是从真实网站获取的,并且可以在网络浏览器中正确加载,因此必须有某种正确的方法来处理它们。

为什么解析带有管道字符的 url 会失败,我该怎么做才能正确解析它们?

解析前需要使用escapeURIStringisUnescapedInURI 将告诉您字符是否允许在 URI 组件中未转义,如 documentation.

中所述
λ> isUnescapedInURI '|'
False

因此,要正确编码和解析它:

λ> parseURI $ escapeURIString isUnescapedInURI "http://something.com/foo|bar"
Just http://something.com/foo%7Cbar

事实上,这个特殊的极端情况在 Hackage 文档中有很好的解释。