代码之家  ›  专栏  ›  技术社区  ›  Martin Sturm

从scala解释器打印Unicode

  •  20
  • Martin Sturm  · 技术社区  · 16 年前

    使用scala解释器(即在命令行上运行命令“scala”)时,我无法正确打印Unicode字符。当然,A-Z、A-Z等都是正确打印的,但例如,_墋墋或_墋打印为A?.

    print(8364.toChar)
    

    结果在?而不是_ 可能我做错了什么。我的终端支持UTF-8字符,甚至当我将输出传输到一个单独的文件并在文本编辑器中打开它时,?显示。

    这一切都发生在Mac OS X(Snow Leopard,2.8)(Scala(夜建)和Java1.6017)上。

    3 回复  |  直到 10 年前
        1
  •  17
  •   Martin Sturm    16 年前

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

    scala> System.getProperty("file.encoding");
    res3: java.lang.String = MacRoman
    

    根据 斯卡拉 帮助测试,可以使用-d选项提供Java属性。但是,这对我来说不起作用。我最终设置了环境变量

    JAVA_OPTS="-Dfile.encoding=UTF-8"
    

    运行后 斯卡拉 ,上一个命令的结果将给出以下结果:

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

    现在,打印特殊字符工作正常:

    print(0x20AC.toChar)               
    €
    

    所以,它不是scala中的bug,而是默认编码的问题。在我看来,如果默认情况下在所有平台上使用UTF-8会更好。在寻找答案的过程中,如果考虑到这一点,我遇到了 discussion 在这个问题的scala邮件列表上。在第一条消息中,当 file.encoding Macroman报告,因为utf-8是Mac OS X上的默认字符集(让我一直想知道为什么 文件编码 默认设置为macroman,这可能是在10发布之前从mac os继承的?我不认为这项建议是2.8级标准的一部分,因为马丁·奥德斯基 wrote 最好是保持Java中的东西(即荣誉)。 文件编码 属性)。

        2
  •  3
  •   Calum    16 年前

    好吧,至少部分,如果不是全部,这里的问题是128不是欧元的Unicode码位。128(或0x80,因为十六进制似乎是标准值)是 U+0080 <control> ,也就是说,它不是可打印字符,所以您的终端打印它时遇到问题也就不足为奇了。

    Euro的代码点是0x20ac(或十进制8364),这似乎对我有用(我在Linux上,在2.8的夜晚):

    scala> print(0x20AC.toChar)
    €
    

    另一个有趣的测试是打印unicode雪人字符:

    scala> print(0x2603.toChar)
    ☃
    

    128,因为_,显然是某个Windows代码页的扩展字符。

    你提到的另一个角色我也在工作:

    scala> 'ƒ'.toInt
    res8: Int = 402
    
    scala> 402.toChar
    res9: Char = ƒ
    
        3
  •  0
  •   Community Mohan Dere    9 年前

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

    1. set JAVA_OPTS="-Dfile.encoding=UTF-8"
    2. chcp 65001

    第2项表示UTF-8

    如果不希望每次打印“chcp 65001”,可以这样在Windows注册表中更改/添加值:

    1. 运行命令 regedit
    2. 查找记录[hkey_current_user\software\microsoft\command processor]
    3. 新建=>字符串值
    4. name=“autorun”,data=“chcp 65001”(不带引号)

    (见 https://superuser.com/a/482117/454417 )

    我使用Windows 10和scala 2.11.8

    推荐文章