1

我在archlinux和PortableAserve上使用sbcl(1.1.15)來編寫Web應用程序。但是當我使用像「測試」這樣的字符時,我遇到了一些麻煩。關於使用PortableAllegroServe的字符編碼

REPL僅顯示錯誤:出錯30334的值不是類型(UNSIGNED-BYTE 8)。 而瀏覽器什麼也沒有顯示。

這裏是我的代碼:

(defpackage #:com.web 
    (:use :common-lisp :net.aserve)) 

(in-package :com.web) 

(defun test-character-encode (req ent) 
    (with-http-response (req ent :content-type "text/html") 
    (with-http-body (req ent) 
     (format 
     (request-reply-stream req) 
     "測試portableallegroserve")))) 

(publish :path "/test" :function 'test-character-encode) 

我該怎麼辦,謝謝!

回答

0

with-http-body該文檔描述了一個:external-format參數,它可能是你所需要的指定:

(with-http-body (req ent &key format headers external-format) &rest body) 

在體內形成的代碼調用(請求 - 應答流REQ)以 獲得流它可以寫入以提供 響應的正文。 此流的外部格式設置爲值 external-format參數(默認值爲 * default-aserve-external-format *)。在對主體 進行評估之前,變量* html-stream *被綁定到(request-reply-stream req)的值。這使得使用html宏可以輕鬆地生成 html作爲響應的一部分。

在此基礎上,或許你需要像

(with-http-body (req ent :external-format :utf-8) 
    (format 
    (request-reply-stream req) 
    "測試portableallegroserve")))) 
+0

如果一切正常,不要忘記設置相應的內容類型:':內容類型「text/html的;字符集= UTF -8「' – acelent

+0

它不起作用,並且REPL打印相同的錯誤信息。我使用(net.aserve.client:do-http-request「http://127.0.0.1:1234/test」)在端口1234訪問localhost。它顯示錯誤消息:在讀取塊塊時出現意外的文件結束 [SIMPLE-ERROR類型的條件] – tskshy

+0

您是否還添加了content-type:header作爲另一個建議? –