Common lisp 如何使drakma能够处理URL中的非拉丁-1字符

Common lisp 如何使drakma能够处理URL中的非拉丁-1字符,common-lisp,drakma,Common Lisp,Drakma,我遇到一个错误,原因是使用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_QUO

我遇到一个错误,原因是使用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)

这个问题与德拉克马无关。这是普里的错。我使用了我的PURI分支:。

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

  • 仅使用拉丁语-1部分构造URI
  • 设定路径
  • 就像:

    
    (let((uri)(puri:uri)https://wikimedia.org")))
    (setf(puri:uri路径uri)
    (连接“字符串”/(drakma:url编码“/ааааааа”:utf-8)
    uri)
    
    产生:

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

    Drakma随后接受此URI而不进行任何额外处理。

    这仍然无法正常工作,因为随后应传输的url为:但Drakma实际发送的是:GET/%25e2%2580%259eWebIRD url HTTP/1.1
    #<PURI:URI https://wikimedia.org/%D0%BA%D0%B0%D0%B4%D0%B0%D0%B1%D1%80%D0%B0>