【问题标题】:Leiningen project program can't output non-ASCII string in WindowsLeiningen 项目程序无法在 Windows 中输出非 ASCII 字符串
【发布时间】:2014-08-23 12:32:31
【问题描述】:

我正在 Windows 中使用 Clojure 代码。

如果我直接使用 Clojure 的 jar 文件,它会毫无问题地输出一个非 ASCII(日文)字符串。

你好.clj:

(println "こんにちは")

> java -jar 1.5.1.jar hello.clj
こんにちは

但在 Leiningen 项目的情况下,它不会按预期输出字符。

src/hello/core.clj:

(defn -main [& args]
  (println "こんにちは"))

> lein run
????????

在这两种情况下,源文件的编码都是UTF-8*out*的类是java.io.OutputStreamWriter,它的编码是MS932(日文代码页)。

(println "*out* :" (class *out*) (.getEncoding *out*))
;; *out* : java.io.OutputStreamWriter MS932

我知道如果我设置环境变量 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 并使用支持 UTF-8 的终端,它将正常工作。

但我想在 Windows 的默认控制台中使用 MS932 输出,就像 jar 文件的情况一样。

【问题讨论】:

    标签: encoding clojure


    【解决方案1】:

    这是一个有趣的问题...如果其中一个返回 こんにちは 而另一个返回 @ 987654326@。似乎 Leiningen 在 Windows 中的默认编码存在问题,但我认为在您的环境中从 Leiningen 运行 (.getEncoding *out*) 会给您带来 MS932 以外的其他东西,否则我不明白为什么它不会打印日文字符在 Windows 终端中...

    之前 Leiningen 预览版本和字符编码出现了一些意想不到的问题...请参阅 this issue from 2012 -- 虽然它可能是特定于 OS X 的(以及更老的 Leiningen 版本),但问题在于 JVM 的默认编码未设置为 UTF-8。我相信 UTF-8 现在是默认设置,但可能在某些 Windows 环境中您需要 MS932。我不使用 Windows,所以这只是在黑暗中拍摄,但是...

    似乎需要将环境变量LEIN_JVM_OPTS 设置为-Dfile.encoding=MS932。有关基于每个项目设置 Leiningen JVM 选项的信息,请参阅this previous SO question。尝试将此行添加到您的 project.clj:

    :jvm-opts ["-Dfile.encoding" "MS932"]
    

    如果可行,那么您可以考虑将其添加到 profiles.clj 中的 :user 条目下,即:

    {:user {:jvm-opts ["-Dfile.encoding" "MS932"]}}
    

    【讨论】:

    • 感谢您的回答。我尝试了它们,但结果没有改变。我将:jvm-opts ["-Dfile.encoding" "MS932"] 添加到project.clj 中,但由于错误而无法正常工作。我想知道:jvm-opts ["-Dfile.encoding=MS932"]。我修改了project.clj,并再次尝试。输出的结果保持“?????????”。于是我直接设置了环境变量LEIN_JVM_OPTS=-Dfile.encoding=MS932,结果还是一样。
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2016-04-15
    相关资源
    最近更新 更多