在Common Lisp中对字符串进行URL解码

6

我有一个包含转义URL的字符串:

http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz

我正在尝试将其解码为以下内容:

http://example.com?foo=bar+baz

然而,我找不到Drakma导出的任何合适的函数。 我可以像这样进行编码:

en code:

* url-string

"http://example.com?foo=bar+baz"
* (drakma:url-encode url-string :utf-8)

"http%3A%2F%2Fexample.com%3Ffoo%3Dbar%2Bbaz"

...所以我认为我走在了正确的轨道上。如果有人能为我提供正确方向上的提示,我将不胜感激 :-)我正在使用SBCL 1.0.54,在64位Linux Mint 13上从源代码构建。

如果这有助于澄清我的意图,在Ruby中,我会执行以下操作:

> uri_string = "http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz"
 => "http%3A%2F%2Fexample.com%3Ffoo%3Dbar+baz" 
> URI.decode uri_string
 => "http://example.com?foo=bar+baz" 

如果你想知道的话,我知道整个URL被转义(包括协议规范),这确实很奇怪。我正在尝试编写一个跨平台的下载客户端,用于澳大利亚的在线音乐商店,该商店提供包含完全转义的URL列表的文件,就像上面的示例一样。 - Duncan Bayne
1
只是问一个显而易见的问题:(关于“DECODE”)没有显示任何有趣的函数吗?(关于“DECODE”“DRAKMA”)? - Rainer Joswig
2个回答

15
一个快速的SLIME会话。
CL-USER> (ql-dist:system-apropos "url")

#<SYSTEM curly / curly-20120407-git / quicklisp 2012-05-20>
#<SYSTEM curly.test / curly-20120407-git / quicklisp 2012-05-20>
#<SYSTEM do-urlencode / do-urlencode-20120407-git / quicklisp 2012-05-20>
#<SYSTEM url-rewrite / url-rewrite-0.1.1 / quicklisp 2012-05-20>

CL-USER> (ql:quickload :do-urlencode)

C-cC-dpdo-urlencodeRET

DO-URLENCODE:URLDECODE
  Function: (not documented)
DO-URLENCODE:URLENCODE
  Function: (not documented)
DO-URLENCODE:URLENCODE-MALFORMED-STRING
  Type: (not documented)
DO-URLENCODE:URLENCODE-MALFORMED-STRING-STRING
  Generic Function: (not documented)

CL-USER> (do-urlencode:urldecode "http%3A%2F%2Fexample.com%3Ffoo%3Dbar%2Bbaz")

"http://example.com?foo=bar+baz"

1
谢谢 :-) 我还在学习“Lisp方式”做事情...我甚至没有想到从REPL获取Quicklisp包的帮助。 - Duncan Bayne

5

我找到了另一个解决方案,使用 Quri 这个库来处理 URI,其中包含编码和解码工具(用于 URI 和参数):

(url-decode "http%3A%2F%2Fexample.com%3Ffoo%3Dbar%2Bbaz")
;; "http://example.com?foo=bar+baz"

使用(ql:quickload :quri)进行安装,然后选择性地使用(use-package :quri)

(我的来源:lisp-lang.org 推荐的库awesome-cl)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接