我在 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ð‘ð’ð“ð”ð•ð�ð–ð—ð˜ð™ðšð›ðœð�ðžðÿð ð¡ð¢ð£ð¤ð¥ð¦ð§ð¨ð©ðªð«ð¬ðð®ð¯
абвгдеёжзийклмнопр�туфхцшщъыь�ю�
我希望您激活对UTF-8(Windows代码页65001
)的
系统范围支持来解决您的问题,因为它将OEM和ANSI代码页设置为
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 随后将打印一条消息,指示使用环境变量。