2017-04-25 80 views
2

我製作了最簡單的Pedestal項目,並在本地執行了我的repl項目。然而,在localhost:8890檢查瀏覽器後,我看到了 (替換字符),而不是我放入Pedestal路徑中的實際文本(西里爾文符號)。使用基座在瀏覽器中無法正確顯示UTF-8符號

我也檢查過瀏覽器devtools響應標頭: 內容類型:text/html; charset = utf-8存在。

之前你問:

  1. 是的,我在響應設置charset=UTF-8,你可以在下面的代碼看看。
  2. 我的core.clj文件也採用UTF-8編碼。
  3. 我也試過其他瀏覽器,同樣的事情。
  4. 附加信息:我使用的是Windows,但從未遇到過與其他庫和框架(ring,yada)之前的問題。難道基座會以某種方式破壞我的代碼,同時將它傳遞給碼頭服務器?我不知道。

項目的全部代碼:

(ns samplepedestal.core 
    (:require [io.pedestal.http :as http] 
      [io.pedestal.http.route :as route]) 
    (:gen-class)) 

(defn html-response 
    [req] 
    {:status 200 
    :body "<html lang=\"ru\"> 
      <head> 
      <meta charset=\"utf-8\" /> 
      <title>Текст на русском</title> 
      </head> 
      <body>Текст на русском</body> 
      </html>" 
    :headers {"Content-Type" "text/html; charset=UTF-8"}}) 

(def routes 
    (route/expand-routes 
    [[["/" {:get `html-response}]]])) 

(def service-map 
    {::http/routes routes 
    ::http/type :jetty 
    ::http/port 8890}) 

(defn start [] 
    (http/start (http/create-server service-map))) 

;; -- Interactive development 
(defonce server (atom nil)) 

(defn start-dev [] 
    (reset! server 
      (http/start (http/create-server 
         (assoc service-map 
           ::http/join? false))))) 

(defn stop-dev [] 
    (http/stop @server)) 

(defn restart [] 
    (stop-dev) 
    (start-dev)) 
;; --- 


(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (println "Hello, World!")) 

這是一種奇怪的現象,我不知道我錯過了什麼,所以任何幫助,將不勝感激。謝謝!

+0

你*確定*您CLJ文件是UTF-8編碼?嘗試寫''u0421'而不是'с'(或其他類似的替代品)。如果服務器正在發送正確的頭文件,那麼您很可能從磁盤讀取了錯誤的字符。或者,您的瀏覽器正在使用的字體可能沒有這些字符的字形? – amalloy

+0

@amalloy,是的,我對utf-8編碼的clj文件很肯定。我試圖寫'\ u0421'而不是'с' - 沒有工作,得到了相同的結果。字體很好,我將相同的html代碼粘貼到本地html文件並打開它,它顯示正確。 –

+1

我在我的電腦上運行了您的代碼,我的瀏覽器正確顯示了西里爾文符號。 –

回答

2

我認爲問題在於REPL如何啓動。你有沿

啓動nREPL服務器線的東西...... 「C:\ PROGRAM 文件\的Java \ jdk1.8.0_66 \ jre的\ BIN \ java的」 -Dfile.encoding = CP1251 -XX:-OmitStackTraceInFastThrow -Dclojure.compile.path = D:\ workspace-clojure \ the-next-big-server-side-thing \ target \ classes -Dthe-next-big-server-side-thing.version = 0.0.1-SNAPSHOT -Dclojure.debug =假-Didea.launcher.port = 50071「-Didea.launcher.bin。

時REPL開始?

如果是這樣,您可能需要添加新的JVM參數來修復該問題。

enter image description here

+0

我爲我的clojure項目使用了不同的編輯器 - 帶proto-repl包的Atom。我直接在cmd或proto-repl中啓動repl,所以我沒有看到你提到的任何行。有沒有其他的方式來檢查或編輯我的JVM參數,而不是在你的圖片中顯示的IntelliJ中? –

+0

所以是的,問題出在我的-Dfile.encoding屬性上。不知道,這個屬性以前的設置是什麼,以及我怎樣才能在沒有它的情況下完美地在其他Clojure項目上工作,但我想這就是你在沒有首先處理Java的情況下跳入Clojure時得到的結果。感謝您的正確答案,@ kond! –

相關問題