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

时间:2014-08-23 12:32:32

标签: encoding clojure

我正在使用Windows中的Clojure代码。

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

hello.clj:

(println "こんにちは")

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

但就Leiningen项目而言,它并没有像预期的那样输出字符。

的src /你好/ 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文件中的情况。

1 个答案:

答案 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"]}}