使用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)上。
答案 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:
第2项意味着UTF-8
如果您不希望每次打印&#34; chcp 65001&#34;,您可以在Windows注册表中更改/添加值,如下所示:
(见https://superuser.com/a/482117/454417)
我使用的是Windows 10和scala 2.11.8