Groovy 西里尔字母输出问题

问题描述 投票:0回答:1

我在 groovy 脚本中的输出有问题。例如这段代码:

def rusAlphabet = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
def lowerCaseRusAlphabet = 'абвгдеёжзийклмнопрстуфхцшщъыьэюя'

println(rusAlphabet)
println(rusAlphabet.toLowerCase())
println(lowerCaseRusAlphabet)

打印:

AБВГДЕ?ЖЗИЙКЛМ?ОПРСТУФХЦЧШЩЪЫЬЭЮЯ
a??
абвгдеёжзийклмнопр?туфхцшщъыь?ю?

它与 Python 脚本配合得很好。我在 Windows 10 x64 上工作。

在 CMD 和 PowerShell 中,西里尔字符显示为问题。然后我在区域管理设置中检查了“Beta:使用 Unicode UTF-8 进行全球语言支持”。现在一切正常,字符显示正常。但不适用于常规脚本。

在脚本中尝试了此代码:

try {
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out), true, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    throw new InternalError("VM does not support mandatory encoding UTF-8");
}

它打印:

AБВГДЕ�ЖЗИЙКЛМ�ОПРСТУФХЦЧШЩЪЫЬЭЮЯ
að‘ð’ð“ð”ð•ð�ð–ð—ð˜ð™ðšð›ðœð�ðžðÿð ð¡ð¢ð£ð¤ð¥ð¦ð§ð¨ð©ðªð«ð¬ð­ð®ð¯
абвгдеёжзийклмнопр�туфхцшщъыь�ю�
powershell groovy encoding command-line locale
1个回答
0
投票
  • 我希望您激活对UTF-8(Windows代码页65001)的

    系统范围
    支持来解决您的问题,因为它将OEMANSI代码页设置为
    65001 
    ,这应该使所有旧版(非 Unicode)程序“讲 UTF-8”。

    • 请注意,激活此功能虽然方便,但会产生深远的影响,并且可能会破坏遗留代码:请参阅此答案了解背景信息。
  • 您的问题意味着 Groovy 不会将您的 源代码 文件(脚本文件)解释为 UTF-8。

    • Groovy,也许不用说,是基于 Java 的,Java 版本 17 及以下使用系统的 ANSI 代码页来解释源代码文件。因此,对于 ANSI 代码页为

      65001
      (即 UTF-8)的情况,这不应该成为问题 - 但也许 Java 会以不同的方式确定 ANSI 代码页。

    • 但是,无论您是否激活了系统范围的 UTF-8 支持,您都可以显式指示 Java 将源代码解释为 UTF-8,如下所示:

      • groovy `-Dfile.encoding=UTF8 <your-Groovy-script>

        • 请注意
          `
          之前的
          -
          ,由于不幸的 bug,这仅在从 PowerShell 调用时才需要 - 请参阅 GitHub 问题 #6291
      • 或者,您可以通过

        JAVA_TOOL_OPTIONS
        环境变量预设此选项(例如,从 PowerShell,对于当前进程:
        $env:JAVA_TOOL_OPTIONS = '-Dfile.encoding=UTF8'
        ),但请注意,Groovy CLI 随后将打印一条消息,指示使用环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.