3

我遇到了由使用 sbcl 在给定 url 中使用的非拉丁 1 字符引起的错误,例如:

(drakma:http-request "http://www.youtube.com/„weird-url")

debugger invoked on a FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR in thread
#<THREAD "initial thread" RUNNING {1002998D23}>:
  #\DOUBLE_LOW-9_QUOTATION_MARK (code 8222) is not a LATIN-1 character.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(FLEXI-STREAMS::SIGNAL-ENCODING-ERROR
 #<FLEXI-STREAMS::FLEXI-LATIN-1-FORMAT (:ISO-8859-1 :EOL-STYLE :LF)
   {1002F196E3}>
 "~S (code ~A) is not a LATIN-1 character."
 #\DOUBLE_LOW-9_QUOTATION_MARK
 8222)

显然,标头被定义为由RFC2616以 Latin-1 格式发送(这是我在遇到此错误后在 github 上打开的票证),因此 URL 在传递给 drakma 之前必须正确编码。但我不知道怎么做,因为显然不可能(因为它不是 LATIN-1 字符)这样做?

我的示例的工作调用是什么(除了 URL 是伪造的并且可以缩短为http://www.youtube.com的事实)?

(drakma:http-request (magic-encoding-function "http://www.youtube.com/„weird-url"))
4

2 回答 2

2

这个问题与 DRAKMA 无关。这是 PURI 的错。我使用我的 PURI 分支:https ://github.com/archimag/puri-unicode 。

于 2013-06-02T15:38:54.110 回答
2

刚刚发现如果缺陷在于新实例化对象的后处理,那么解决方法可能是将过程分为两部分:

  1. 仅使用 Latin-1 部分构造 URI。
  2. 设置路径

就像:

(let ((uri (puri:uri "https://wikimedia.org"))) (setf (puri:uri-path uri) (concatenate 'string "/" (drakma:url-encode "/кадабра" :utf-8))) uri) 产生:

#<PURI:URI https://wikimedia.org/%D0%BA%D0%B0%D0%B4%D0%B0%D0%B1%D1%80%D0%B0>

然后 Drakma 接受此 URI,无需任何额外处理。

于 2018-02-13T13:46:55.840 回答