2017-04-25 78 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! –

相关问题