Encoding UTF-8符号未在使用底座的浏览器中正确显示

Encoding UTF-8符号未在使用底座的浏览器中正确显示,encoding,utf-8,clojure,jetty,pedestal,Encoding,Utf 8,Clojure,Jetty,Pedestal,我已经做了一个最简单的基座项目,并在我的repl本地运行它。然而,在检查了localhost:8890的浏览器后,我看到� (替换字符)而不是实际的文本(西里尔字母符号),我把我的底座路线 我还签入了浏览器devtools响应标题: 内容类型:text/html;存在字符集=utf-8 在你提问之前: 是的,我设置了charset=UTF-8作为响应,正如您在下面的代码中看到的 我的core.clj文件也采用UTF-8编码 我也尝试过其他浏览器,同样的事情 附加信息:我正在使用Windows,但

我已经做了一个最简单的基座项目,并在我的repl本地运行它。然而,在检查了
localhost:8890的浏览器后,我看到� (替换字符)而不是实际的文本(西里尔字母符号),我把我的底座路线

我还签入了浏览器devtools响应标题: 内容类型:text/html;存在字符集=utf-8

在你提问之前:

  • 是的,我设置了
    charset=UTF-8
    作为响应,正如您在下面的代码中看到的
  • 我的
    core.clj
    文件也采用UTF-8编码
  • 我也尝试过其他浏览器,同样的事情
  • 附加信息:我正在使用Windows,但在其他库和框架(ring、yada)中从未遇到过这个问题。是否可能是基座在将代码传递给jetty服务器时以某种方式在内部破坏了我的代码?我不知道
  • 整个项目代码:

    (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!"))
    
    (ns sampledesidel.core
    (:require[io.dames.http:as-http]
    [io.DELATE.http.route:作为路由])
    (:gen类)
    (defn)html响应
    [请求]
    {:现状200
    :正文“
    Текст на русском
    Текст на русском
    "
    :标题{“内容类型”text/html;字符集=UTF-8“})
    (def路线
    (路线/扩展路线)
    [[“/”{:get`html response}]]])
    (def服务地图
    {::http/routes路由
    ::http/type:jetty
    ::http/port 8890})
    (定义开始[]
    (http/start(http/createserver服务映射)))
    ;; -- 交互开发
    (defonce服务器(atom nil))
    (defn启动dev[]
    (重置!服务器
    (http/start(http/create服务器
    (助理服务地图)
    ::http/join?false(()()))
    (定义停止开发[]
    (http/stop@server))
    (defn重新启动[]
    (停止开发)
    (启动开发)
    ;; ---
    (defn-main)
    “我还没有做很多……还没有。”
    [&args]
    (打印“你好,世界!”)
    

    这是一种奇怪的行为,我不知道我遗漏了什么,所以任何帮助都将不胜感激。谢谢

    我认为问题在于REPL如何启动。你有类似的东西吗

    正在启动nREPL服务器。。。“C:\程序 Files\Java\jdk1.8.0\u 66\jre\bin\Java“-Dfile.encoding=Cp1251 -XX:-OmitStackTraceInFastThrow-Dclojure.compile.path=D:\workspace clojure\next big server-side thing\target\classes -数据下一个大的服务器端事件。版本=0.0.1-SNAPSHOT-Dclojure.debug=false-Didea.launcher.port=50071“-Didea.launcher.bin

    REPL什么时候开始

    如果是这样,您可能需要添加新的JVM参数来解决这个问题


    您确定您的clj文件是utf-8编码的吗?请尝试编写
    \u0421
    而不是
    c
    (或其他类似替换)。如果服务器发送了正确的标题,则很可能是您从磁盘读取了错误的字符。或者,您的浏览器使用的字体没有这些字符的字形?@amalloy,是的,我对utf-8编码的clj文件持肯定态度。我尝试编写
    \u0421
    而不是
    С
    -不起作用,得到了相同的结果结果。字体很好,我将相同的html代码粘贴到本地html文件中并打开,显示正确。我在我的电脑上运行了你的代码,我的浏览器正确显示了西里尔字母符号。@AlbertP,好吧,我为你感到高兴,但问题仍然存在。有什么想法吗?我为我的clojure项目使用不同的编辑器-Atom和proto-repl包。我art repl要么直接在cmd中,要么在proto repl中,所以我没有看到您提到的任何行。有没有其他方法来检查或编辑我的JVM参数,而不是像您在图片中所显示的那样在IntelliJ中?是的,问题在于我的-Dfile.encoding属性。不知道,这个属性之前的设置是什么,我是如何管理的在没有它的情况下可以完美地在其他Clojure项目上工作,但我想这就是你在没有先处理Java的情况下跳入Clojure时得到的结果。谢谢你的正确答案,@akond!