Leiningen 项目程序无法在 Windows 中输出非 ASCII 字符串



我在Windows中使用Clojure代码。

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

hello.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文件的情况下一样。

这是一个有趣的问题…如果其中一个返回こんにちは,另一个返回????????,那么使用Leiningen运行(println *out* (class *out*) (.getEncoding *out*))会给您提供与直接使用Clojure jar文件运行它相同的结果,这似乎很奇怪。似乎在Windows中Leiningen的默认编码存在问题,但我认为在您的环境中从Leiningen运行(.getEncoding *out*)会给您提供MS932以外的东西,否则我不明白为什么它不会在Windows终端中打印日文字符…

在Leiningen预览构建和字符编码做意想不到的事情之前存在问题…看看这个2012年的问题——虽然它可能是OS X特定的(和一个更老的Leiningen版本),问题是JVM的默认编码没有设置为UTF-8。我相信UTF-8现在是默认的,但也许在某些Windows环境中你需要MS932。我不用Windows,所以这只是瞎猜,但是……

似乎需要将环境变量LEIN_JVM_OPTS设置为-Dfile.encoding=MS932。请参阅前面关于在每个项目的基础上设置Leiningen JVM选项的SO问题。尝试将这一行添加到您的project.clj:

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

如果可以,那么您可以考虑将它添加到配置文件中的:user条目下。clj,即:

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

最新更新