中文在scala中用REPL乱码

时间:2011-11-25 10:33:52

标签: scala cjk read-eval-print-loop

当我在REPL中输入中文字符时,只显示问号,如我的第二个屏幕截图所示。我怎样才能解决这个问题?我的scala版本是2.9.0.1和操作系统窗口

before input the Chinese: 中国 using 搜狗输入法

after input

Can't display the Chinese word correctly

即使我使用属性-Dfile.encoding="UTF-8"

启动REPL

2 个答案:

答案 0 :(得分:5)

您必须告诉REPL您要使用unicode(或任何编码)。试试

scala -Dfile.encoding="UTF-8"
打开REPL时

答案 1 :(得分:3)

啊,你在Windows上。我认为目前不支持这种做法。我知道发生了什么。有关调查,请参阅https://issues.scala-lang.org/browse/SI-4711

问题的根源是:

  1. jline2(它的jansi依赖项)加载一个DLL,该DLL使用8位getc的某种变体来读取控制台上的字符,并且不支持双字节字符。可以使用的API调用是ReadConsoleInputW
  2. REPL输出打印使用底层Java System.out,它不能可靠地打印unicode字符 - 尽管您问题中的第一个快照似乎暗示它可以正常工作 *
  3. 我不是Scala团队的成员,但我试图修复它,我可能会有更多或更少的工作。请参阅https://github.com/fusesource/jansi-native/blame/master/src/main/java/org/fusesource/jansi/internal/WindowsSupport.java(基于WriteConsoleWReadConsoleInputW以及REPL ILoop来源中的其他添加内容 - 更改位于github上my fork的某处 - 未更新而。

    如果您有兴趣,我可以提供2.9.0.1 scala-compiler.jar和jline.jar的实验分支,您可以告诉我它是否有效。

    * 打印:1: xx 2:xx 3:xx 4:x 5:x的代码是什么,其中x是一些中文字符?