我正在使用Windows中的Clojure代码。
如果我直接使用Clojure的jar文件,它会毫无问题地输出非ASCII(日语)字符串。
(println "こんにちは")
> java -jar 1.5.1.jar hello.clj
こんにちは
但就Leiningen项目而言,它并没有像预期的那样输出字符。
(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文件中的情况。
答案 0 :(得分:0)
这是一个有趣的问题......使用Leiningen运行(println *out* (class *out*) (.getEncoding *out*))
会产生与使用Clojure jar文件直接运行它相同的结果,如果其中一个返回こんにちは
并且另一个返回????????
。看起来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
。请参阅this previous SO question有关基于每个项目设置Leiningen JVM选项的信息。尝试将此行添加到project.clj:
:jvm-opts ["-Dfile.encoding" "MS932"]
如果可行,那么您可以考虑将其添加到profiles.clj中的:user
条目中,即:
{:user {:jvm-opts ["-Dfile.encoding" "MS932"]}}