Clojure China

使用ring mock测试api遇到unicode编码问题

#1

最近用clojure做一个玩具,遇到一个编码问题。英文输出正确,中文就遇到问题。记录下。

;;测试
(route
  (-> (mock/request :get "/post/57f8de8846526b2e551639df")))

;;repl输出
{:status 200,
 :headers {"Content-Type" "application/json;charset=UTF-8", "Vary" "Accept"},
 :body "{\"user-obj\":null,\"post\":\"\\u4fdd\\u6301\\u8282\\u594f\\uff01\"}"}

#2

(defn query-post [id]
  (resource :allowed-methods [:get]

            :available-media-types tools/avaliable-media-types

            :handle-ok (fn [_]
                         ;;unicode
                         ;{:post (:content (post/query id))} 
                         ;;正常
                         (str {:post (:content (post/query id))}))
            :handle-exception #(tools/handle-exception %)))

上述是简化后的后端代码,临时解决办法是加个str。但不了解为什么,有群友遇到类似问题否?

备注:
查阅过程中遇到的一篇文章jetty处理 http response header中文字符,调试笔记

#3

这编码很正常啊

要是不想被编码为 unicode 的话,就手动序列化 json,然后 :escape-unicode false

http://clojure.github.io/data.json/#clojure.data.json/write

#4

谢谢。


;;中文编码
(write-str (post/query id)  :escape-unicode false))

备注: 期间还犯过一个错,忘记引入[monger.json],导致id出现过问题(数据库驱动是monger)。继续升级打怪…