从Scala解释器打印Unicode

时间:2009-12-22 17:49:01

标签: scala utf-8 interpreter

使用scala解释器(即在命令行上运行命令'scala')时,我无法正确打印unicode字符。当然a-z,A-Z等打印正确,但例如€或ƒ打印为?。

print(8364.toChar)

导致?而不是€。 可能我做错了什么。我的终端支持utf-8字符,甚至当我将输出管道传输到一个单独的文件并在texteditor中打开时,?显示。

这一切都发生在使用Scala 2.8(每晚构建)和Java 1.6.0_17的Mac OS X(Snow Leopard,10.6.2)上。

3 个答案:

答案 0 :(得分:17)

我找到了问题的原因,并找到了使其按预期工作的解决方案。 正如我在发布问题和阅读Calum的答案以及使用另一个项目(使用Java)在Mac上编码问题后我已经怀疑的那样,问题的原因是Mac OS X使用的默认编码。当你开始{ {1}}解释器,它将使用指定平台的默认编码。在Mac OS X上,这是Macroman,在Windows上它可能是CP1252。您可以通过在scala解释器中键入以下命令来检查:

scala

根据scala> System.getProperty("file.encoding"); res3: java.lang.String = MacRoman 帮助测试,可以使用-D选项提供Java属性。但是,这对我不起作用。我最终设置了环境变量

scala

运行JAVA_OPTS="-Dfile.encoding=UTF-8" 后,上一个命令的结果将给出以下结果:

scala

现在,打印特殊字符按预期工作:

scala> System.getProperty("file.encoding")
res0: java.lang.String = UTF-8

因此,它不是Scala中的错误,而是默认编码的问题。在我看来,如果在所有平台上默认使用UTF-8会更好。如果考虑到这一点,我在搜索答案时,在此问题上我在Scala邮件列表上遇到了discussion。在第一条消息中,当print(0x20AC.toChar) € 报告Macroman时,建议在Mac OS X上默认使用UTF-8,因为UTF-8是Mac OS X上的默认字符集(让我想知道为什么file.encoding默认情况下设置为Macroman,这可能是10 OS发布之前Mac OS的继承?)。我不认为这个提议将成为Scala 2.8的一部分,因为Martin Odersky wrote最好保留Java中的东西(即尊重file.encoding属性)。

答案 1 :(得分:3)

好的,至少部分(如果不是全部)你的问题是128不是Euro的Unicode代码点。 128(或0x80,因为十六进制似乎是标准)是U+0080 <control>,即它不是一个可打印的字符,所以你的终端在打印时遇到麻烦并不奇怪。

欧元的代码点是0x20AC(或十进制的8364),这似乎对我有用(我在Linux上,每晚2.8):

scala> print(0x20AC.toChar)
€

另一个有趣的测试是打印Unicode雪人角色:

scala> print(0x2603.toChar)
☃

128 as€显然是来自其中一个Windows代码页的扩展字符。

我还提到了你提到的另一个角色:

scala> 'ƒ'.toInt
res8: Int = 402

scala> 402.toChar
res9: Char = ƒ

答案 2 :(得分:0)

对于命令行中的Windows(cmd)print:

  1. {{1}}
  2. {{1}}
  3. 第2项意味着UTF-8

    如果您不希望每次打印&#34; chcp 65001&#34;,您可以在Windows注册表中更改/添加值,如下所示:

    1. 运行命令{{1}}
    2. 查找记录[HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor]
    3. 新=&gt;字符串值
    4. 名称=&#34;自动运行&#34;,数据=&#34; chcp 65001&#34; (没有引号)
    5. (见https://superuser.com/a/482117/454417

      我使用的是Windows 10和scala 2.11.8