我在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"]}}